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

[1/4] syncope git commit: [SYNCOPE-745] report management + refactoring ModalPanel interface; still missing reportlets

Repository: syncope
Updated Branches:
  refs/heads/master e87e4102d -> ae52b12e1


http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_ru.properties
deleted file mode 100644
index bf48601..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_ru.properties
+++ /dev/null
@@ -1,25 +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.
-#
-# start=Начало
-start=\u041d\u0430\u0447\u0430\u043b\u043e
-# end=Окончание
-end=\u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435
-# status=Статус
-status=\u0421\u0442\u0430\u0442\u0443\u0441
-# execution.view=Итоговый статус запуска задачи '${key}'
-execution.view=\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyTogglePanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyTogglePanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyTogglePanel.html
index 602aec8..f2b070e 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyTogglePanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyTogglePanel.html
@@ -36,7 +36,7 @@ under the License.
         <ul class="menu">
           <li><i class="fa fa-minus"></i><a href="#" wicket:id="delete"><wicket:message key="resource.menu.remove"/></a></li>
           <li><i class="fa fa-pencil"></i><a href="#" wicket:id="edit"><wicket:message key="resource.menu.edit"/></a></li>
-          <li><i class="fa fa-pencil"></i><a href="#" wicket:id="provision"><wicket:message key="resource.menu.provision"/></a></li>
+          <li><i class="fa fa-exchange"></i><a href="#" wicket:id="provision"><wicket:message key="resource.menu.provision"/></a></li>
           <li><i class="fa fa-search"></i><a href="#" wicket:id="explore"><wicket:message key="resource.menu.explore"/></a></li>
           <li><i class="fa fa-arrow-right"></i><a href="#" wicket:id="propagation"><wicket:message key="task.propagation.list"/></a></li>
           <li><i class="fa fa-chevron-circle-left"></i><a href="#" wicket:id="pull"><wicket:message key="task.pull.list"/></a></li>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
index b025ccd..62731fd 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
@@ -44,6 +44,7 @@ under the License.
     <span wicket:id="panelReset">[plus]</span>
     <span wicket:id="panelEdit">[plus]</span>
     <span wicket:id="panelTypeExtensions">[plus]</span>
+    <span wicket:id="panelFoEdit">[plus]</span>
     <span wicket:id="panelHtmlEdit">[plus]</span>
     <span wicket:id="panelTextEdit">[plus]</span>
     <span wicket:id="panelLayoutEdit">[plus]</span>
@@ -126,6 +127,10 @@ under the License.
       <a href="#" wicket:id="typeExtensionsLink" class="btn"><i id="actionLink" class="fa fa-expand" alt="typeExtensions icon" title="Type extensions"></i></a>
     </wicket:fragment>
 
+    <wicket:fragment wicket:id="fragmentFoEdit">
+      <a href="#" wicket:id="foEditLink" class="btn"><i id="actionLink" class="fa fa-file-pdf-o" alt="fo edit icon" title="FO Edit"></i></a>
+    </wicket:fragment>
+
     <wicket:fragment wicket:id="fragmentHtmlEdit">
       <a href="#" wicket:id="htmlEditLink" class="btn"><i id="actionLink" class="fa fa-file-code-o" alt="html edit icon" title="HTML Edit"></i></a>
     </wicket:fragment>
@@ -145,7 +150,7 @@ under the License.
     <wicket:fragment wicket:id="fragmentPropagationTasks">
       <a href="#" wicket:id="propagationTasksLink" class="btn"><i class="fa fa-arrow-right" alt="PropagationTasks icon" title="PropagationTasks"></i></a>
     </wicket:fragment>
-    
+
     <wicket:fragment wicket:id="fragmentNotificationTasks">
       <a href="#" wicket:id="notificationTasksLink" class="btn"><i class="fa fa-envelope-o" alt="NotificationTasks icon" title="NotificationTasks"></i></a>
     </wicket:fragment>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/ext/camel/client-console/src/main/java/org/apache/syncope/client/console/panels/CamelRoutesDirectoryPanel.java
----------------------------------------------------------------------
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 719fd0b..e1d0b81 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
@@ -81,7 +81,7 @@ public class CamelRoutesDirectoryPanel extends DirectoryPanel<
             private static final long serialVersionUID = -6388405037134399367L;
 
             @Override
-            public ModalPanel<CamelRouteTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
+            public WizardModalPanel<CamelRouteTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
                 final CamelRouteTO modelObject = newModelObject();
                 return new CamelRoutesModalPanel(modal, modelObject, pageRef) {
 


[2/4] syncope git commit: [SYNCOPE-745] report management + refactoring ModalPanel interface; still missing reportlets

Posted by fm...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
index 53cdaf0..69bb761 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
@@ -62,6 +62,7 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
         super.add(new Fragment("panelCreate", "emptyFragment", this));
         super.add(new Fragment("panelEdit", "emptyFragment", this));
         super.add(new Fragment("panelTypeExtensions", "emptyFragment", this));
+        super.add(new Fragment("panelFoEdit", "emptyFragment", this));
         super.add(new Fragment("panelHtmlEdit", "emptyFragment", this));
         super.add(new Fragment("panelTextEdit", "emptyFragment", this));
         super.add(new Fragment("panelLayoutEdit", "emptyFragment", this));
@@ -330,6 +331,25 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
                 }.setVisible(link.isEnabled(model.getObject())));
                 break;
 
+            case FO_EDIT:
+                fragment = new Fragment("panelFoEdit", "fragmentFoEdit", this);
+
+                fragment.addOrReplace(new IndicatingAjaxLink<Void>("foEditLink") {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target) {
+                        link.onClick(target, model.getObject());
+                    }
+
+                    @Override
+                    public String getAjaxIndicatorMarkupId() {
+                        return disableIndicator ? StringUtils.EMPTY : super.getAjaxIndicatorMarkupId();
+                    }
+                }.setVisible(link.isEnabled(model.getObject())));
+                break;
+
             case HTML_EDIT:
                 fragment = new Fragment("panelHtmlEdit", "fragmentHtmlEdit", this);
 
@@ -888,6 +908,10 @@ public final class ActionLinksPanel<T extends Serializable> extends Panel {
                 super.addOrReplace(new Fragment("panelEdit", "emptyFragment", this));
                 break;
 
+            case FO_EDIT:
+                super.addOrReplace(new Fragment("panelFoEdit", "emptyFragment", this));
+                break;
+
             case HTML_EDIT:
                 super.addOrReplace(new Fragment("panelHtmlEdit", "emptyFragment", this));
                 break;

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
index 86c491c..a988fd2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
@@ -22,7 +22,6 @@ import java.io.Serializable;
 import java.util.Iterator;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
@@ -37,8 +36,11 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.apache.syncope.client.console.panels.SubmitableModalPanel;
+import org.apache.syncope.client.console.panels.WizardModalPanel;
 
-public abstract class AjaxWizard<T extends Serializable> extends Wizard implements ModalPanel<T> {
+public abstract class AjaxWizard<T extends Serializable> extends Wizard
+        implements SubmitableModalPanel, WizardModalPanel<T> {
 
     private static final long serialVersionUID = -1272120742876833520L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/wizards/ModalPanelBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/ModalPanelBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/ModalPanelBuilder.java
index 62db09a..23786b0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/ModalPanelBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/ModalPanelBuilder.java
@@ -19,8 +19,8 @@
 package org.apache.syncope.client.console.wizards;
 
 import java.io.Serializable;
-import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.wicket.PageReference;
+import org.apache.syncope.client.console.panels.WizardModalPanel;
 
 public interface ModalPanelBuilder<T extends Serializable> extends Serializable {
 
@@ -32,7 +32,7 @@ public interface ModalPanelBuilder<T extends Serializable> extends Serializable
      * @param mode mode.
      * @return wizard.
      */
-    ModalPanel<T> build(String id, int index, AjaxWizard.Mode mode);
+    WizardModalPanel<T> build(String id, int index, AjaxWizard.Mode mode);
 
     T getDefaultItem();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
index 42d98b1..74ad18d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/WizardMgtPanel.java
@@ -24,7 +24,6 @@ import java.util.Arrays;
 import java.util.List;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.NotificationPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wizards.any.ResultPage;
@@ -46,6 +45,7 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
+import org.apache.syncope.client.console.panels.WizardModalPanel;
 
 public abstract class WizardMgtPanel<T extends Serializable> extends Panel implements IEventSource {
 
@@ -146,7 +146,7 @@ public abstract class WizardMgtPanel<T extends Serializable> extends Panel imple
             if (event.getPayload() instanceof AjaxWizard.NewItemActionEvent && newItemPanelBuilder != null) {
                 newItemPanelBuilder.setItem(item);
 
-                final ModalPanel<T> modalPanel = newItemPanelBuilder.build(
+                final WizardModalPanel<T> modalPanel = newItemPanelBuilder.build(
                         actualId,
                         ((AjaxWizard.NewItemActionEvent<T>) newItemEvent).getIndex(),
                         item != null ? AjaxWizard.Mode.EDIT : AjaxWizard.Mode.CREATE);

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java
index 45b4aa3..0057c82 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ResultPage.java
@@ -19,19 +19,18 @@
 package org.apache.syncope.client.console.wizards.any;
 
 import java.io.Serializable;
-import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.syncope.client.console.panels.WizardModalPanel;
 
 /**
  *
  * @param <T> item input type
  */
-public abstract class ResultPage<T extends Serializable> extends Panel implements ModalPanel<T> {
+public abstract class ResultPage<T extends Serializable> extends Panel implements WizardModalPanel<T> {
 
     private static final long serialVersionUID = -1619945285130369086L;
 
@@ -60,16 +59,6 @@ public abstract class ResultPage<T extends Serializable> extends Panel implement
     protected abstract Panel customResultBody(final String panleId, final T item, final Serializable result);
 
     @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Unsupported operation.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Unsupported operation.");
-    }
-
-    @Override
     public T getItem() {
         return this.item;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index a8a0963..12ed32e 100644
--- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -825,3 +825,19 @@ div#transformersContainer #body a {
 /**
 END - Transformers toggle panel
 */
+
+/**
+START - CRONTAB
+*/
+div#schedule input, div#schedule fieldset {
+  width: 50px;
+  float: left
+}
+
+div#templates {
+  padding-top: 30px;
+  clear: both;
+}
+/**
+END -CRONTAB
+*/

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/META-INF/resources/css/topology.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/topology.css b/client/console/src/main/resources/META-INF/resources/css/topology.css
index 6770252..99f421c 100644
--- a/client/console/src/main/resources/META-INF/resources/css/topology.css
+++ b/client/console/src/main/resources/META-INF/resources/css/topology.css
@@ -177,19 +177,3 @@ div.node-action-link .dropdown-menu{
   margin: 0px;
   border-radius: 0.5em;
 }
-
-/**
-START - CRONTAB
-*/
-div#schedule input, div#schedule fieldset {
-  width: 50px;
-  float: left
-}
-
-div#templates {
-  padding-top: 30px;
-  clear: both;
-}
-/**
-END -CRONTAB
-*/

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/notifications/MailTemplateContentModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/MailTemplateContentModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/MailTemplateContentModal.html
deleted file mode 100644
index 2f30d1f..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/MailTemplateContentModal.html
+++ /dev/null
@@ -1,53 +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:head>
-    <link rel="stylesheet" type="text/css" href="webjars/codemirror/${codemirror.version}/lib/codemirror.css"/>
-
-    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/lib/codemirror.js"></script>
-    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/mode/xml/xml.js"></script>
-    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/addon/display/autorefresh.js"></script>
-    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/addon/search/search.js"></script>
-    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/addon/search/searchcursor.js"></script>
-    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/addon/edit/closetag.js"></script>
-    <script type="text/javascript">
-      function updateTextArea(editor) {
-        document.getElementById("templateDefForm").children["template"].value = editor.getValue();
-      }
-    </script>
-    <style>
-      .w_content_3 {
-        padding: 0;
-        color: #333333;
-        font-family: Verdana,Tahoma,sans-serif;
-        font-size: 100%;
-        border: 1px solid #BBBBBB;
-        padding: 1%;
-      }
-    </style>
-  </wicket:head>
-  <wicket:panel>
-    <div style="padding: 1%;">
-      <div class="w_content_3" id="templateDefForm">
-        <textarea wicket:id="template" id="template" name="template" style="width: 100%; height: 350px;">
-        </textarea>
-      </div>
-    </div>
-  </wicket:panel>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/notifications/MailTemplateModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/MailTemplateModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/MailTemplateModal.html
deleted file mode 100644
index 3a0676c..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/MailTemplateModal.html
+++ /dev/null
@@ -1,28 +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">
-  <head><title></title></head>
-  <body>
-    <wicket:panel>
-      <div class="form-group">
-        <span wicket:id="key"/>
-      </div>
-    </wicket:panel>
-  </body>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateContentModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateContentModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateContentModal.html
new file mode 100644
index 0000000..2f30d1f
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateContentModal.html
@@ -0,0 +1,53 @@
+<!--
+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:head>
+    <link rel="stylesheet" type="text/css" href="webjars/codemirror/${codemirror.version}/lib/codemirror.css"/>
+
+    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/lib/codemirror.js"></script>
+    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/mode/xml/xml.js"></script>
+    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/addon/display/autorefresh.js"></script>
+    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/addon/search/search.js"></script>
+    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/addon/search/searchcursor.js"></script>
+    <script type="text/javascript" src="webjars/codemirror/${codemirror.version}/addon/edit/closetag.js"></script>
+    <script type="text/javascript">
+      function updateTextArea(editor) {
+        document.getElementById("templateDefForm").children["template"].value = editor.getValue();
+      }
+    </script>
+    <style>
+      .w_content_3 {
+        padding: 0;
+        color: #333333;
+        font-family: Verdana,Tahoma,sans-serif;
+        font-size: 100%;
+        border: 1px solid #BBBBBB;
+        padding: 1%;
+      }
+    </style>
+  </wicket:head>
+  <wicket:panel>
+    <div style="padding: 1%;">
+      <div class="w_content_3" id="templateDefForm">
+        <textarea wicket:id="template" id="template" name="template" style="width: 100%; height: 350px;">
+        </textarea>
+      </div>
+    </div>
+  </wicket:panel>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
new file mode 100644
index 0000000..3a0676c
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/TemplateModal.html
@@ -0,0 +1,28 @@
+<!--
+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">
+  <head><title></title></head>
+  <body>
+    <wicket:panel>
+      <div class="form-group">
+        <span wicket:id="key"/>
+      </div>
+    </wicket:panel>
+  </body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.html
index d6895eb..63604ec 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.html
@@ -18,25 +18,18 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:extend>
-
     <section class="content-header">
-      <h1>
-        &nbsp;
-        <small>Work in progress</small>
-      </h1>
+      <h1>&nbsp;</h1>
       <ol class="breadcrumb">
-        <li><a wicket:id="dashboardBr"><i class="fa fa-dashboard"></i> <wicket:message key="dashboard"/></a></li>
-        <li class="active"><wicket:message key="reports"/></li>
+        <li><a wicket:id="dashboardBr"><i class="fa fa-dashboard"></i> <wicket:message key="dashboard"></wicket:message></a></li>
+        <li class="active"><wicket:message key="roles"></wicket:message></li>
       </ol>
     </section>
 
-    <section class="content">
-      <div class="progress progress active" style="margin:100px">
-        <div style="width: 70%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="20" role="progressbar" class="progress-bar progress-bar-success progress-bar-striped">
-          <span class="sr-only">20% Complete</span>
-        </div>
+    <section class="content" wicket:id="content">
+      <div class="box">
+        <div class="box-body" wicket:id="tabbedPanel"/>
       </div>
     </section>
-
   </wicket:extend>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.properties
new file mode 100644
index 0000000..78e6676
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports.properties
@@ -0,0 +1,18 @@
+# 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.
+reports=Reports
+report.templates=Templates

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_it.properties
new file mode 100644
index 0000000..732d43d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_it.properties
@@ -0,0 +1,18 @@
+# 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.
+reports=Report
+report.templates=Template

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_pt_BR.properties
new file mode 100644
index 0000000..e675da7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_pt_BR.properties
@@ -0,0 +1,18 @@
+# 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.
+reports=Reports
+report.templates=Template

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_ru.properties
new file mode 100644
index 0000000..aebdef7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Reports_ru.properties
@@ -0,0 +1,21 @@
+# 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.
+#
+# reports=\u00d0\u00a3\u00d0\u00b2\u00d0\u00b5\u00d0\u00b4\u00d0\u00be\u00d0\u00bc\u00d0\u00bb\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u008f
+reports=Reports
+# report.templates=\u00d0\u00a8\u00d0\u00b0\u00d0\u00b1\u00d0\u00bb\u00d0\u00be\u00d0\u00bd\u00d1\u008b
+report.templates=\u0428\u0430\u0431\u043b\u043e\u043d\u044b

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel.html
new file mode 100644
index 0000000..356e28f
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel.html
@@ -0,0 +1,57 @@
+<!--
+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:head>
+    <style type="text/css">
+      div#startAt {
+        background-color: rgba(98, 98, 98, 0.98) !important;
+        color: #CCC;
+        right: 5px !important;
+        top: 100px !important;
+        min-width: 300px;
+        min-height: 130px !important;
+        z-index: 6000 !important;
+      }
+
+      div#startAtContainer {
+        padding: 15px;
+      }
+
+      div#startAtContainer input {
+        background-color: rgba(200, 200, 200, 0.60) !important;
+      }
+    </style>
+  </wicket:head>
+  <wicket:extend>
+    <div id="startAtContainer">
+      <form wicket:id="startAtForm">
+        <div class="form-group">
+          <span wicket:id="startAtCheck"/>
+        </div>
+        <div class="input-group">
+          <span wicket:id="startAtDate"/>
+
+          <div class="input-group-addon">
+            <a wicket:id="startAt"><i class="fa fa-gear"></i></a>
+          </div>
+        </div>
+      </form>
+    </div>
+  </wicket:extend>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel.properties
new file mode 100644
index 0000000..3d5178b
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel.properties
@@ -0,0 +1,17 @@
+# 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.
+startAtCheck=Specify a starting date

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_it.properties
new file mode 100644
index 0000000..69c1c22
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_it.properties
@@ -0,0 +1,17 @@
+# 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.
+startAtCheck=Specifica una data di partenza

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_pt_BR.properties
new file mode 100644
index 0000000..3d5178b
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_pt_BR.properties
@@ -0,0 +1,17 @@
+# 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.
+startAtCheck=Specify a starting date

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_ru.properties
new file mode 100644
index 0000000..d7fabde
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/StartAtTogglePanel_ru.properties
@@ -0,0 +1,19 @@
+# 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.
+#
+# startAtCheck=Укажите дату начала
+startAtCheck=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0430\u0442\u0443 \u043d\u0430\u0447\u0430\u043b\u0430

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.html
new file mode 100644
index 0000000..e4c5611
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.html
@@ -0,0 +1,23 @@
+<!--
+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>
+    <span wicket:id="startAt"/>
+  </wicket:extend>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
new file mode 100644
index 0000000..5b05753
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel.properties
@@ -0,0 +1,35 @@
+# 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.
+profile=Profile
+executions=Executions
+title=Reports
+
+name=Report
+lastExec=Last Execution
+nextExec=Next Execution
+
+start=Start date
+end=End date
+latestExecStatus=Last execution status
+
+active=Active
+
+any.edit=Edit Report ${key}
+any.new=New Report
+any.finish=Submit Report
+any.cancel=Cancel Report
+report.view=Executions of report '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
new file mode 100644
index 0000000..89ec0ab
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_it.properties
@@ -0,0 +1,35 @@
+# 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.
+profile=Profilo
+executions=Esecuzioni
+title=Reports
+
+name=Report
+lastExec=Last Execution
+nextExec=Next Execution
+
+start=Data di avvio
+end=Data di conclusione
+latestExecStatus=Stato ultima esecuzione
+
+active=Active
+
+any.edit=Modifica Report ${key}
+any.new=Nuovo Report
+any.finish=Conferma Report
+any.cancel=Annulla Report
+report.view=Esecuzioni del report '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
new file mode 100644
index 0000000..d13bf06
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_pt_BR.properties
@@ -0,0 +1,35 @@
+# 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.
+profile=Profilo
+executions=Esecuzioni
+title=Reports
+
+name=Report
+lastExec=Last Execution
+nextExec=Next Execution
+
+start=Data inicial
+end=Data Final
+latestExecStatus=Stato ultima esecuzione
+
+active=Active
+
+any.edit=Edit Report ${key}
+any.new=New Report
+any.finish=Submit Report
+any.cancel=Cancel Report
+report.view=Executions of report '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
new file mode 100644
index 0000000..18fee1d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportDirectoryPanel_ru.properties
@@ -0,0 +1,43 @@
+# 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.
+#
+# profile=\u00d0\u009f\u00d1\u0080\u00d0\u00be\u00d1\u0084\u00d0\u00b8\u00d0\u00bb\u00d1\u008c
+profile=\u041f\u0440\u043e\u0444\u0438\u043b\u044c
+# executions=\u00d0\u0097\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba\u00d0\u00b8 \u00d0\u00b7\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d0\u00b8
+executions=\u0417\u0430\u043f\u0443\u0441\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438
+# title=\u00d0\u0097\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d0\u00b0
+title=Reports
+
+name=Report
+lastExec=Last Execution
+nextExec=Next Execution
+
+# start=\u00d0\u0094\u00d0\u00b0\u00d1\u0082\u00d0\u00b0 \u00d0\u00bd\u00d0\u00b0\u00d1\u0087\u00d0\u00b0\u00d0\u00bb\u00d0\u00b0
+start=\u0414\u0430\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430
+# end=\u00d0\u0094\u00d0\u00b0\u00d1\u0082\u00d0\u00b0 \u00d0\u00be\u00d0\u00ba\u00d0\u00be\u00d0\u00bd\u00d1\u0087\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u008f
+end=\u0414\u0430\u0442\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f
+# latestExecStatus=\u00d0\u00a1\u00d1\u0082\u00d0\u00b0\u00d1\u0082\u00d1\u0083\u00d1\u0081 \u00d0\u00bf\u00d1\u0080\u00d0\u00b5\u00d0\u00b4\u00d1\u008b\u00d0\u00b4\u00d1\u0083\u00d1\u0089\u00d0\u00b5\u00d0\u00b3\u00d0\u00be \u00d0\u00b7\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba\u00d0\u00b0
+latestExecStatus=\u0421\u0442\u0430\u0442\u0443\u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430
+
+active=Active
+
+any.edit=Edit Report ${key}
+any.new=New Report
+any.finish=Submit Report
+any.cancel=Cancel Report
+# task.view=\u00d0\u0097\u00d0\u00b0\u00d0\u00bf\u00d1\u0083\u00d1\u0081\u00d0\u00ba\u00d0\u00b8 \u00d0\u00b7\u00d0\u00b0\u00d0\u00b4\u00d0\u00b0\u00d1\u0087\u00d0\u00b8
+report.view=Executions of report '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportExecutionDetails.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportExecutionDetails.html b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportExecutionDetails.html
new file mode 100644
index 0000000..54ff764
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportExecutionDetails.html
@@ -0,0 +1,24 @@
+<!--
+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:panel>
+    <div wicket:id="executions"></div>
+    <wicket:child/>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.properties
new file mode 100644
index 0000000..c8af92f
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.properties
@@ -0,0 +1,20 @@
+# 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.
+any.edit=Edit ${key}
+any.new=New report template
+any.finish=Submit
+any.cancel=Cancel

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_it.properties
new file mode 100644
index 0000000..5f60980
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_it.properties
@@ -0,0 +1,20 @@
+# 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.
+any.edit=Modifica ${key}
+any.new=New report template
+any.finish=Invia
+any.cancel=Annulla

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_pt_BR.properties
new file mode 100644
index 0000000..43c6aa0
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_pt_BR.properties
@@ -0,0 +1,20 @@
+# 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.
+any.edit=Editar ${key}
+any.new=Novo report template
+any.finish=Enviar
+any.cancel=Cancelar

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_ru.properties
new file mode 100644
index 0000000..3634692
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel_ru.properties
@@ -0,0 +1,25 @@
+# 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.
+#
+# any.edit=\u00d0\u0098\u00d0\u00b7\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c ${key}
+any.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c ${key}
+# any.new=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d1\u0082\u00d1\u008c \u00d1\u0088\u00d0\u00b0\u00d0\u00b1\u00d0\u00bb\u00d0\u00be\u00d0\u00bd \u00d1\u0083\u00d0\u00b2\u00d0\u00b5\u00d0\u00b4\u00d0\u00be\u00d0\u00bc\u00d0\u00bb\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u008f
+any.new=New report template
+# any.finish=\u00d0\u00a1\u00d0\u00be\u00d1\u0085\u00d1\u0080\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u0082\u00d1\u008c
+any.finish=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
+# any.cancel=\u00d0\u009e\u00d1\u0082\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b0
+any.cancel=\u041e\u0442\u043c\u0435\u043d\u0430

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
new file mode 100644
index 0000000..b090ddd
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.html
@@ -0,0 +1,25 @@
+<!--
+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:panel>
+    <div class="form-group"><span wicket:id="name">[id]</span></div>
+    <div class="form-group"><span wicket:id="template">[template]</span></div>
+    <div class="form-group"><span wicket:id="active">[active]</span></div>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.properties
new file mode 100644
index 0000000..0e59026
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile.properties
@@ -0,0 +1,19 @@
+# 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.
+name=Name
+active=Active
+template=Template

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_it.properties
new file mode 100644
index 0000000..07ea43c
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_it.properties
@@ -0,0 +1,19 @@
+# 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.
+name=Name
+active=Attivo
+template=Template

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_pt_BR.properties
new file mode 100644
index 0000000..0e59026
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_pt_BR.properties
@@ -0,0 +1,19 @@
+# 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.
+name=Name
+active=Active
+template=Template

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_ru.properties
new file mode 100644
index 0000000..4e4e1a3
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Profile_ru.properties
@@ -0,0 +1,21 @@
+# 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.
+#
+# name=\u00d0\u009d\u00d0\u00b0\u00d0\u00b7\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5
+name=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435
+active=Active
+template=Template

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Schedule.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Schedule.html b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Schedule.html
new file mode 100644
index 0000000..99e853e
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/reports/ReportWizardBuilder$Schedule.html
@@ -0,0 +1,26 @@
+<!--
+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">
+  <head><title></title></head>
+  <body>
+    <wicket:panel>
+      <span wicket:id="schedule"/>
+    </wicket:panel>
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.properties
new file mode 100644
index 0000000..99f323a
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.properties
@@ -0,0 +1,20 @@
+# 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.
+start=Start
+end=End
+status=Status
+execution.view=Result status of execution '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_it.properties
new file mode 100644
index 0000000..3c525b7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_it.properties
@@ -0,0 +1,20 @@
+# 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.
+start=Start
+end=End
+status=Stato
+execution.view=Risultato dello stato dell'esecuzione '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_pt_BR.properties
new file mode 100644
index 0000000..99f323a
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_pt_BR.properties
@@ -0,0 +1,20 @@
+# 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.
+start=Start
+end=End
+status=Status
+execution.view=Result status of execution '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_ru.properties
new file mode 100644
index 0000000..bf48601
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel_ru.properties
@@ -0,0 +1,25 @@
+# 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.
+#
+# start=Начало
+start=\u041d\u0430\u0447\u0430\u043b\u043e
+# end=Окончание
+end=\u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435
+# status=Статус
+status=\u0421\u0442\u0430\u0442\u0443\u0441
+# execution.view=Итоговый статус запуска задачи '${key}'
+execution.view=\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel.html
deleted file mode 100644
index 356e28f..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel.html
+++ /dev/null
@@ -1,57 +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:head>
-    <style type="text/css">
-      div#startAt {
-        background-color: rgba(98, 98, 98, 0.98) !important;
-        color: #CCC;
-        right: 5px !important;
-        top: 100px !important;
-        min-width: 300px;
-        min-height: 130px !important;
-        z-index: 6000 !important;
-      }
-
-      div#startAtContainer {
-        padding: 15px;
-      }
-
-      div#startAtContainer input {
-        background-color: rgba(200, 200, 200, 0.60) !important;
-      }
-    </style>
-  </wicket:head>
-  <wicket:extend>
-    <div id="startAtContainer">
-      <form wicket:id="startAtForm">
-        <div class="form-group">
-          <span wicket:id="startAtCheck"/>
-        </div>
-        <div class="input-group">
-          <span wicket:id="startAtDate"/>
-
-          <div class="input-group-addon">
-            <a wicket:id="startAt"><i class="fa fa-gear"></i></a>
-          </div>
-        </div>
-      </form>
-    </div>
-  </wicket:extend>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel.properties
deleted file mode 100644
index 3d5178b..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel.properties
+++ /dev/null
@@ -1,17 +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.
-startAtCheck=Specify a starting date

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_it.properties
deleted file mode 100644
index 69c1c22..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_it.properties
+++ /dev/null
@@ -1,17 +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.
-startAtCheck=Specifica una data di partenza

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_pt_BR.properties
deleted file mode 100644
index 3d5178b..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_pt_BR.properties
+++ /dev/null
@@ -1,17 +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.
-startAtCheck=Specify a starting date

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_ru.properties
deleted file mode 100644
index d7fabde..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/StartAtTogglePanel_ru.properties
+++ /dev/null
@@ -1,19 +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.
-#
-# startAtCheck=Укажите дату начала
-startAtCheck=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0430\u0442\u0443 \u043d\u0430\u0447\u0430\u043b\u0430

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails.html b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails.html
deleted file mode 100644
index 54ff764..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails.html
+++ /dev/null
@@ -1,24 +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:panel>
-    <div wicket:id="executions"></div>
-    <wicket:child/>
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails.properties
deleted file mode 100644
index 99f323a..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails.properties
+++ /dev/null
@@ -1,20 +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.
-start=Start
-end=End
-status=Status
-execution.view=Result status of execution '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_it.properties
deleted file mode 100644
index 3c525b7..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_it.properties
+++ /dev/null
@@ -1,20 +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.
-start=Start
-end=End
-status=Stato
-execution.view=Risultato dello stato dell'esecuzione '${key}'

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_pt_BR.properties
deleted file mode 100644
index 99f323a..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TaskExecutionDetails_pt_BR.properties
+++ /dev/null
@@ -1,20 +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.
-start=Start
-end=End
-status=Status
-execution.view=Result status of execution '${key}'


[4/4] syncope git commit: [SYNCOPE-745] report management + refactoring ModalPanel interface; still missing reportlets

Posted by fm...@apache.org.
[SYNCOPE-745] report management + refactoring ModalPanel interface; still missing reportlets


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

Branch: refs/heads/master
Commit: ae52b12e1432253900e5712af419855e595fac20
Parents: e87e410
Author: fmartelli <fa...@gmail.com>
Authored: Thu Apr 28 18:39:11 2016 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Thu Apr 28 18:39:11 2016 +0200

----------------------------------------------------------------------
 .../client/console/approvals/ApprovalModal.java |   5 +-
 .../client/console/bulk/BulkActionModal.java    |   4 +-
 .../client/console/bulk/BulkContent.java        |  10 +-
 .../notifications/MailTemplateContentModal.java | 120 ---------
 .../MailTemplateDirectoryPanel.java             |  24 +-
 .../notifications/MailTemplateModal.java        |  72 -----
 .../notifications/NotificationTasks.java        |  21 +-
 .../notifications/TemplateContentModal.java     | 124 +++++++++
 .../console/notifications/TemplateModal.java    |  76 ++++++
 .../syncope/client/console/pages/Reports.java   |  60 +++++
 .../console/panels/AbstractModalPanel.java      |   3 +-
 .../console/panels/AjaxDataTablePanel.java      |   5 +-
 .../console/panels/AnyTypeClassesPanel.java     |   4 +-
 .../client/console/panels/AnyTypesPanel.java    |   2 +-
 .../panels/ConnObjectDirectoryPanel.java        |  18 +-
 .../client/console/panels/ConnObjects.java      |  19 +-
 .../client/console/panels/DirectoryPanel.java   |   6 +-
 .../console/panels/FailureMessageModal.java     |  19 +-
 .../client/console/panels/ModalPanel.java       |  10 +-
 .../client/console/panels/ParametersPanel.java  |   2 +-
 .../console/panels/RelationshipTypesPanel.java  |   3 +-
 .../client/console/panels/SchemaTypePanel.java  |   2 +-
 .../console/panels/SecurityQuestionsPanel.java  |   3 +-
 .../console/panels/StartAtTogglePanel.java      | 105 ++++++++
 .../console/panels/SubmitableModalPanel.java    |  29 +++
 .../panels/TypeExtensionDirectoryPanel.java     |   7 +-
 .../client/console/panels/WizardModalPanel.java |  26 ++
 .../console/reports/ReportDirectoryPanel.java   | 261 +++++++++++++++++++
 .../console/reports/ReportExecutionDetails.java |  54 ++++
 .../reports/ReportStartAtTogglePanel.java       |  39 +++
 .../reports/ReportTemplateDirectoryPanel.java   | 251 ++++++++++++++++++
 .../console/reports/ReportWizardBuilder.java    | 108 ++++++++
 .../client/console/rest/BaseRestClient.java     |   3 +-
 .../console/rest/ExecutionRestClient.java       |   6 +-
 .../console/rest/NotificationRestClient.java    |   9 +-
 .../client/console/rest/ReportRestClient.java   |  63 ++++-
 .../syncope/client/console/rest/RestClient.java |  24 ++
 .../client/console/rest/TaskRestClient.java     |   2 +
 .../client/console/rest/TemplateRestClient.java |  36 +++
 .../console/status/StatusDirectoryPanel.java    |  19 +-
 .../client/console/status/StatusModal.java      |  20 +-
 .../client/console/tasks/AbstractTasks.java     |  20 +-
 .../console/tasks/ExecutionsDirectoryPanel.java | 232 +++++++++++++++++
 .../tasks/NotificationTaskDirectoryPanel.java   |   2 +-
 .../tasks/PropagationTaskDirectoryPanel.java    |   2 +-
 .../console/tasks/SchedTaskDirectoryPanel.java  |   9 +-
 .../console/tasks/SchedTaskWizardBuilder.java   |  12 +-
 .../console/tasks/StartAtTogglePanel.java       | 106 --------
 .../console/tasks/TaskDirectoryPanel.java       |  20 +-
 .../console/tasks/TaskExecutionDetails.java     |   3 +-
 .../client/console/tasks/TaskExecutions.java    | 227 ----------------
 .../console/tasks/TaskStartAtTogglePanel.java   |  39 +++
 .../markup/html/bootstrap/dialog/BaseModal.java |  17 +-
 .../wicket/markup/html/form/ActionLink.java     |   1 +
 .../markup/html/form/ActionLinksPanel.java      |  24 ++
 .../client/console/wizards/AjaxWizard.java      |   6 +-
 .../console/wizards/ModalPanelBuilder.java      |   4 +-
 .../client/console/wizards/WizardMgtPanel.java  |   4 +-
 .../client/console/wizards/any/ResultPage.java  |  15 +-
 .../META-INF/resources/css/syncopeConsole.css   |  16 ++
 .../META-INF/resources/css/topology.css         |  16 --
 .../notifications/MailTemplateContentModal.html |  53 ----
 .../notifications/MailTemplateModal.html        |  28 --
 .../notifications/TemplateContentModal.html     |  53 ++++
 .../console/notifications/TemplateModal.html    |  28 ++
 .../syncope/client/console/pages/Reports.html   |  19 +-
 .../client/console/pages/Reports.properties     |  18 ++
 .../client/console/pages/Reports_it.properties  |  18 ++
 .../console/pages/Reports_pt_BR.properties      |  18 ++
 .../client/console/pages/Reports_ru.properties  |  21 ++
 .../console/panels/StartAtTogglePanel.html      |  57 ++++
 .../panels/StartAtTogglePanel.properties        |  17 ++
 .../panels/StartAtTogglePanel_it.properties     |  17 ++
 .../panels/StartAtTogglePanel_pt_BR.properties  |  17 ++
 .../panels/StartAtTogglePanel_ru.properties     |  19 ++
 .../console/reports/ReportDirectoryPanel.html   |  23 ++
 .../reports/ReportDirectoryPanel.properties     |  35 +++
 .../reports/ReportDirectoryPanel_it.properties  |  35 +++
 .../ReportDirectoryPanel_pt_BR.properties       |  35 +++
 .../reports/ReportDirectoryPanel_ru.properties  |  43 +++
 .../console/reports/ReportExecutionDetails.html |  24 ++
 .../ReportTemplateDirectoryPanel.properties     |  20 ++
 .../ReportTemplateDirectoryPanel_it.properties  |  20 ++
 ...eportTemplateDirectoryPanel_pt_BR.properties |  20 ++
 .../ReportTemplateDirectoryPanel_ru.properties  |  25 ++
 .../reports/ReportWizardBuilder$Profile.html    |  25 ++
 .../ReportWizardBuilder$Profile.properties      |  19 ++
 .../ReportWizardBuilder$Profile_it.properties   |  19 ++
 ...ReportWizardBuilder$Profile_pt_BR.properties |  19 ++
 .../ReportWizardBuilder$Profile_ru.properties   |  21 ++
 .../reports/ReportWizardBuilder$Schedule.html   |  26 ++
 .../tasks/ExecutionsDirectoryPanel.properties   |  20 ++
 .../ExecutionsDirectoryPanel_it.properties      |  20 ++
 .../ExecutionsDirectoryPanel_pt_BR.properties   |  20 ++
 .../ExecutionsDirectoryPanel_ru.properties      |  25 ++
 .../console/tasks/StartAtTogglePanel.html       |  57 ----
 .../console/tasks/StartAtTogglePanel.properties |  17 --
 .../tasks/StartAtTogglePanel_it.properties      |  17 --
 .../tasks/StartAtTogglePanel_pt_BR.properties   |  17 --
 .../tasks/StartAtTogglePanel_ru.properties      |  19 --
 .../console/tasks/TaskExecutionDetails.html     |  24 --
 .../tasks/TaskExecutionDetails.properties       |  20 --
 .../tasks/TaskExecutionDetails_it.properties    |  20 --
 .../tasks/TaskExecutionDetails_pt_BR.properties |  20 --
 .../tasks/TaskExecutionDetails_ru.properties    |  25 --
 .../console/topology/TopologyTogglePanel.html   |   2 +-
 .../markup/html/form/ActionLinksPanel.html      |   7 +-
 .../panels/CamelRoutesDirectoryPanel.java       |   2 +-
 108 files changed, 2463 insertions(+), 1110 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalModal.java b/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalModal.java
index dc0d90b..9398a5b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/approvals/ApprovalModal.java
@@ -20,7 +20,6 @@ package org.apache.syncope.client.console.approvals;
 
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.rest.UserWorkflowRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -30,8 +29,10 @@ import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.syncope.client.console.panels.SubmitableModalPanel;
+import org.apache.syncope.client.console.panels.WizardModalPanel;
 
-public class ApprovalModal extends Panel implements ModalPanel<WorkflowFormTO> {
+public class ApprovalModal extends Panel implements SubmitableModalPanel, WizardModalPanel<WorkflowFormTO> {
 
     private static final long serialVersionUID = -8847854414429745216L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java
index 033ee0a..17cf48d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkActionModal.java
@@ -22,7 +22,7 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
 import org.apache.syncope.client.console.panels.AbstractModalPanel;
-import org.apache.syncope.client.console.rest.BaseRestClient;
+import org.apache.syncope.client.console.rest.RestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.wicket.PageReference;
@@ -38,7 +38,7 @@ public class BulkActionModal<T extends Serializable, S> extends AbstractModalPan
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
             final Collection<ActionLink.ActionType> actions,
-            final BaseRestClient bulkActionExecutor,
+            final RestClient bulkActionExecutor,
             final String keyFieldName) {
 
         super(modal, pageRef);

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
index 5110119..8bbd088 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
@@ -31,7 +31,7 @@ import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
-import org.apache.syncope.client.console.rest.BaseRestClient;
+import org.apache.syncope.client.console.rest.RestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BulkActionResultColumn;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
@@ -64,7 +64,7 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
             final Collection<ActionLink.ActionType> actions,
-            final BaseRestClient bulkActionExecutor,
+            final RestClient bulkActionExecutor,
             final String keyFieldName) {
 
         this(MultilevelPanel.SECOND_LEVEL_ID, modal, items, columns, actions, bulkActionExecutor, keyFieldName);
@@ -76,7 +76,7 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
             final Collection<T> items,
             final List<IColumn<T, S>> columns,
             final Collection<ActionLink.ActionType> actions,
-            final BaseRestClient bulkActionExecutor,
+            final RestClient bulkActionExecutor,
             final String keyFieldName) {
 
         super(id);
@@ -143,8 +143,8 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                                 throw new IllegalArgumentException("Invalid bulk action executor");
                             }
 
-                            final AbstractAnyRestClient<?> anyRestClient =
-                                    AbstractAnyRestClient.class.cast(bulkActionExecutor);
+                            final AbstractAnyRestClient<?> anyRestClient = AbstractAnyRestClient.class.cast(
+                                    bulkActionExecutor);
 
                             if (items.isEmpty() || !(items.iterator().next() instanceof StatusBean)) {
                                 throw new IllegalArgumentException("Invalid items");

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateContentModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateContentModal.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateContentModal.java
deleted file mode 100644
index 55804cb..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateContentModal.java
+++ /dev/null
@@ -1,120 +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.notifications;
-
-import java.io.Serializable;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.AbstractModalPanel;
-import org.apache.syncope.client.console.rest.NotificationRestClient;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.types.MailTemplateFormat;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.OnLoadHeaderItem;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.TextArea;
-import org.apache.wicket.model.PropertyModel;
-
-public class MailTemplateContentModal extends AbstractModalPanel<Serializable> {
-
-    private static final long serialVersionUID = 2053048734388383021L;
-
-    private final MailTemplateContent content;
-
-    public MailTemplateContentModal(
-            final BaseModal<Serializable> modal,
-            final MailTemplateContent content,
-            final PageReference pageRef) {
-
-        super(modal, pageRef);
-        this.content = content;
-
-        TextArea<String> templateDefArea = new TextArea<>("template", new PropertyModel<String>(content, "content"));
-        templateDefArea.setMarkupId("template").setOutputMarkupPlaceholderTag(true);
-        add(templateDefArea);
-    }
-
-    @Override
-    public void renderHead(final IHeaderResponse response) {
-        super.renderHead(response);
-        response.render(OnLoadHeaderItem.forScript(
-                "CodeMirror.fromTextArea(document.getElementById('template'), {"
-                + "  lineNumbers: true, "
-                + "  lineWrapping: true, "
-                + "  autoCloseTags: true, "
-                + "  mode: 'text/html', "
-                + "  autoRefresh: true"
-                + "}).on('change', updateTextArea);"));
-    }
-
-    @Override
-    public MailTemplateContent getItem() {
-        return this.content;
-    }
-
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        try {
-            new NotificationRestClient().updateTemplateFormat(
-                    content.getKey(), content.getContent(), content.getFormat());
-            info(getString(Constants.OPERATION_SUCCEEDED));
-            modal.show(false);
-            modal.close(target);
-        } catch (Exception e) {
-            LOG.error("While updating template for {}", content.getKey(), e);
-            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
-        }
-        SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
-    }
-
-    public static class MailTemplateContent implements Serializable {
-
-        private static final long serialVersionUID = -1756961687134322845L;
-
-        private final String key;
-
-        private String content;
-
-        private final MailTemplateFormat format;
-
-        public MailTemplateContent(final String key, final MailTemplateFormat format) {
-            this.key = key;
-            this.format = format;
-        }
-
-        public String getKey() {
-            return key;
-        }
-
-        public String getContent() {
-            return content;
-        }
-
-        public void setContent(final String content) {
-            this.content = content;
-        }
-
-        public MailTemplateFormat getFormat() {
-            return format;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
index a781f4c..2b9d072 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateDirectoryPanel.java
@@ -32,7 +32,6 @@ import org.apache.syncope.client.console.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
 import org.apache.syncope.client.console.notifications.MailTemplateDirectoryPanel.MailTemplateProvider;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
-import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.rest.NotificationRestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -54,6 +53,7 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
+import org.apache.syncope.client.console.panels.WizardModalPanel;
 
 public class MailTemplateDirectoryPanel
         extends DirectoryPanel<MailTemplateTO, MailTemplateTO, MailTemplateProvider, NotificationRestClient> {
@@ -75,16 +75,18 @@ public class MailTemplateDirectoryPanel
         utilityModal.size(Modal.Size.Large);
         utilityModal.addSubmitButton();
 
+        restClient = new NotificationRestClient();
         addNewItemPanelBuilder(new AbstractModalPanelBuilder<MailTemplateTO>(new MailTemplateTO(), pageRef) {
 
             private static final long serialVersionUID = 1995192603527154740L;
 
             @Override
-            public ModalPanel<MailTemplateTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
-                return new MailTemplateModal(modal, new MailTemplateTO(), pageReference);
+            public WizardModalPanel<MailTemplateTO> build(
+                    final String id, final int index, final AjaxWizard.Mode mode) {
+                return new TemplateModal<MailTemplateTO, MailTemplateFormat>(
+                        modal, restClient, new MailTemplateTO(), pageReference);
             }
         }, true);
-        restClient = new NotificationRestClient();
 
         initResultTable();
 
@@ -113,14 +115,15 @@ public class MailTemplateDirectoryPanel
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final MailTemplateTO ignore) {
-                        MailTemplateContentModal.MailTemplateContent content =
-                                new MailTemplateContentModal.MailTemplateContent(
+                        TemplateContentModal.TemplateContent<MailTemplateFormat> content
+                                = new TemplateContentModal.TemplateContent<MailTemplateFormat>(
                                         model.getObject().getKey(), MailTemplateFormat.HTML);
                         content.setContent(
                                 restClient.readTemplateFormat(model.getObject().getKey(), MailTemplateFormat.HTML));
 
                         utilityModal.header(new ResourceModel("mail.template.html", "HTML Content"));
-                        utilityModal.setContent(new MailTemplateContentModal(utilityModal, content, pageRef));
+                        utilityModal.setContent(new TemplateContentModal<MailTemplateTO, MailTemplateFormat>(
+                                utilityModal, restClient, content, pageRef));
                         utilityModal.show(true);
                         target.add(utilityModal);
                     }
@@ -132,15 +135,16 @@ public class MailTemplateDirectoryPanel
 
                     @Override
                     public void onClick(final AjaxRequestTarget target, final MailTemplateTO ignore) {
-                        MailTemplateContentModal.MailTemplateContent content =
-                                new MailTemplateContentModal.MailTemplateContent(
+                        TemplateContentModal.TemplateContent<MailTemplateFormat> content
+                                = new TemplateContentModal.TemplateContent<MailTemplateFormat>(
                                         model.getObject().getKey(), MailTemplateFormat.TEXT);
                         content.setContent(
                                 restClient.readTemplateFormat(model.getObject().getKey(), MailTemplateFormat.TEXT));
 
                         utilityModal.setFormModel(content);
                         utilityModal.header(new ResourceModel("mail.template.text", "TEXT Content"));
-                        utilityModal.setContent(new MailTemplateContentModal(utilityModal, content, pageRef));
+                        utilityModal.setContent(new TemplateContentModal<MailTemplateTO, MailTemplateFormat>(
+                                utilityModal, restClient, content, pageRef));
                         utilityModal.show(true);
                         target.add(utilityModal);
                     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateModal.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateModal.java
deleted file mode 100644
index 69ec7aa..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/MailTemplateModal.java
+++ /dev/null
@@ -1,72 +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.notifications;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.AbstractModalPanel;
-import org.apache.syncope.client.console.rest.NotificationRestClient;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.MailTemplateTO;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.model.PropertyModel;
-
-public class MailTemplateModal extends AbstractModalPanel<MailTemplateTO> {
-
-    private static final long serialVersionUID = 2053048734388383021L;
-
-    private final MailTemplateTO mailTemplateTO;
-
-    public MailTemplateModal(
-            final BaseModal<MailTemplateTO> modal,
-            final MailTemplateTO mailTemplateTO,
-            final PageReference pageRef) {
-        super(modal, pageRef);
-        this.mailTemplateTO = mailTemplateTO;
-
-        final AjaxTextFieldPanel key
-                = new AjaxTextFieldPanel("key", "key", new PropertyModel<String>(mailTemplateTO, "key"), false);
-        key.setOutputMarkupPlaceholderTag(true);
-        add(key.setRenderBodyOnly(true));
-    }
-
-    @Override
-    public MailTemplateTO getItem() {
-        return this.mailTemplateTO;
-    }
-
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        try {
-            new NotificationRestClient().createTemplate(mailTemplateTO);
-            info(getString(Constants.OPERATION_SUCCEEDED));
-            modal.show(false);
-            modal.close(target);
-        } catch (SyncopeClientException e) {
-            LOG.error("While creating template for {}", mailTemplateTO.getKey(), e);
-            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
-        }
-        SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationTasks.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationTasks.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationTasks.java
index 4d24824..68d2553 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationTasks.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationTasks.java
@@ -18,23 +18,20 @@
  */
 package org.apache.syncope.client.console.notifications;
 
-import java.io.Serializable;
 import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.tasks.NotificationTaskDirectoryPanel;
 import org.apache.syncope.client.console.tasks.TaskExecutionDetails;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.common.lib.to.NotificationTO;
 import org.apache.syncope.common.lib.to.NotificationTaskTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
 
-public class NotificationTasks extends Panel implements ModalPanel<Serializable> {
+public class NotificationTasks extends Panel implements ModalPanel {
 
     private static final long serialVersionUID = 1066124171682570083L;
 
@@ -75,20 +72,4 @@ public class NotificationTasks extends Panel implements ModalPanel<Serializable>
             }
         });
     }
-
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public NotificationTO getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateContentModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateContentModal.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateContentModal.java
new file mode 100644
index 0000000..416475d
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateContentModal.java
@@ -0,0 +1,124 @@
+/*
+ * 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.notifications;
+
+import java.io.Serializable;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.AbstractModalPanel;
+import org.apache.syncope.client.console.rest.TemplateRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.EntityTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.OnLoadHeaderItem;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.model.PropertyModel;
+
+public class TemplateContentModal<T extends EntityTO, F> extends AbstractModalPanel<Serializable> {
+
+    private static final long serialVersionUID = 2053048734388383021L;
+
+    private final TemplateContent<F> content;
+
+    private final TemplateRestClient<T, F> restClient;
+
+    public TemplateContentModal(
+            final BaseModal<Serializable> modal,
+            final TemplateRestClient<T, F> restClient,
+            final TemplateContent<F> content,
+            final PageReference pageRef) {
+
+        super(modal, pageRef);
+        this.restClient = restClient;
+        this.content = content;
+
+        TextArea<String> templateDefArea = new TextArea<>("template", new PropertyModel<String>(content, "content"));
+        templateDefArea.setMarkupId("template").setOutputMarkupPlaceholderTag(true);
+        add(templateDefArea);
+    }
+
+    @Override
+    public void renderHead(final IHeaderResponse response) {
+        super.renderHead(response);
+        response.render(OnLoadHeaderItem.forScript(
+                "CodeMirror.fromTextArea(document.getElementById('template'), {"
+                + "  lineNumbers: true, "
+                + "  lineWrapping: true, "
+                + "  autoCloseTags: true, "
+                + "  mode: 'text/html', "
+                + "  autoRefresh: true"
+                + "}).on('change', updateTextArea);"));
+    }
+
+    @Override
+    public TemplateContent<F> getItem() {
+        return this.content;
+    }
+
+    @Override
+    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+        try {
+            restClient.updateTemplateFormat(
+                    content.getKey(), content.getContent(), content.getFormat());
+            info(getString(Constants.OPERATION_SUCCEEDED));
+            modal.show(false);
+            modal.close(target);
+        } catch (Exception e) {
+            LOG.error("While updating template for {}", content.getKey(), e);
+            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+        }
+        SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+    }
+
+    public static class TemplateContent<F> implements Serializable {
+
+        private static final long serialVersionUID = -1756961687134322845L;
+
+        private final String key;
+
+        private String content;
+
+        private final F format;
+
+        public TemplateContent(final String key, final F format) {
+            this.key = key;
+            this.format = format;
+        }
+
+        public String getKey() {
+            return key;
+        }
+
+        public String getContent() {
+            return content;
+        }
+
+        public void setContent(final String content) {
+            this.content = content;
+        }
+
+        public F getFormat() {
+            return format;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
new file mode 100644
index 0000000..aa85776
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/TemplateModal.java
@@ -0,0 +1,76 @@
+/*
+ * 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.notifications;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.panels.AbstractModalPanel;
+import org.apache.syncope.client.console.rest.TemplateRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.EntityTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.PropertyModel;
+
+public class TemplateModal<T extends EntityTO, F> extends AbstractModalPanel<T> {
+
+    private static final long serialVersionUID = 2053048734388383021L;
+
+    private final T templateTO;
+
+    private TemplateRestClient<T, F> restClient;
+
+    public TemplateModal(
+            final BaseModal<T> modal,
+            final TemplateRestClient<T, F> restClient,
+            final T templateTO,
+            final PageReference pageRef) {
+        super(modal, pageRef);
+        this.restClient = restClient;
+        this.templateTO = templateTO;
+
+        final AjaxTextFieldPanel key
+                = new AjaxTextFieldPanel("key", "key", new PropertyModel<String>(templateTO, "key"), false);
+        key.setOutputMarkupPlaceholderTag(true);
+        add(key.setRenderBodyOnly(true));
+    }
+
+    @Override
+    public T getItem() {
+        return this.templateTO;
+    }
+
+    @Override
+    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+        try {
+            restClient.createTemplate(templateTO);
+            info(getString(Constants.OPERATION_SUCCEEDED));
+            modal.show(false);
+            modal.close(target);
+        } catch (SyncopeClientException e) {
+            LOG.error("While creating template for {}", templateTO.getKey(), e);
+            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+        }
+        SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/pages/Reports.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Reports.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Reports.java
index f089554..c01da4c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Reports.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Reports.java
@@ -18,7 +18,23 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
+import java.util.ArrayList;
+import java.util.List;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
+import org.apache.syncope.client.console.panels.MultilevelPanel;
+import org.apache.syncope.client.console.reports.ReportDirectoryPanel;
+import org.apache.syncope.client.console.reports.ReportExecutionDetails;
+import org.apache.syncope.client.console.reports.ReportTemplateDirectoryPanel;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
+import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 public class Reports extends BasePage {
@@ -29,5 +45,49 @@ public class Reports extends BasePage {
         super(parameters);
 
         body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class));
+
+        WebMarkupContainer content = new WebMarkupContainer("content");
+        content.setOutputMarkupId(true);
+        content.setMarkupId("reports");
+        content.add(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList()));
+        body.add(content);
+    }
+
+    private List<ITab> buildTabList() {
+        final List<ITab> tabs = new ArrayList<>();
+
+        tabs.add(new AbstractTab(new ResourceModel("reports")) {
+
+            private static final long serialVersionUID = -6815067322125799251L;
+
+            @Override
+            public Panel getPanel(final String panelId) {
+                final MultilevelPanel mlp = new MultilevelPanel(panelId);
+                mlp.setFirstLevel(new ReportDirectoryPanel(mlp, getPageReference()) {
+
+                    private static final long serialVersionUID = -2195387360323687302L;
+
+                    @Override
+                    protected void viewTask(final ReportTO reportTO, final AjaxRequestTarget target) {
+                        mlp.next(
+                                new StringResourceModel("report.view", this, new Model<>(reportTO)).getObject(),
+                                new ReportExecutionDetails(reportTO, getPageReference()),
+                                target);
+                    }
+                });
+                return mlp;
+            }
+        });
+
+        tabs.add(new AbstractTab(new ResourceModel("report.templates")) {
+
+            private static final long serialVersionUID = -6815067322125799251L;
+
+            @Override
+            public Panel getPanel(final String panelId) {
+                return new ReportTemplateDirectoryPanel(panelId, getPageReference());
+            }
+        });
+        return tabs;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
index c69f2b1..fe84533 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
@@ -32,7 +32,8 @@ import org.apache.wicket.markup.html.panel.Panel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AbstractModalPanel<T extends Serializable> extends Panel implements ModalPanel<T> {
+public class AbstractModalPanel<T extends Serializable> extends Panel
+        implements SubmitableModalPanel, WizardModalPanel<T> {
 
     private static final long serialVersionUID = 8611724965544132636L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
index 017659b..e06090a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
@@ -30,6 +30,7 @@ import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormChoic
 import org.apache.syncope.client.console.bulk.BulkActionModal;
 import org.apache.syncope.client.console.bulk.BulkContent;
 import org.apache.syncope.client.console.panels.DirectoryPanel.EventDataWrapper;
+import org.apache.syncope.client.console.rest.RestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -65,7 +66,7 @@ public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTab
 
         private final Collection<ActionLink.ActionType> bulkActions = new ArrayList<>();
 
-        private BaseRestClient bulkActionExecutor;
+        private RestClient bulkActionExecutor;
 
         private String itemKeyField;
 
@@ -108,7 +109,7 @@ public final class AjaxDataTablePanel<T extends Serializable, S> extends DataTab
 
         public Builder<T, S> setBulkActions(
                 final Collection<ActionLink.ActionType> bulkActions,
-                final BaseRestClient bulkActionExecutor,
+                final RestClient bulkActionExecutor,
                 final String itemKeyField) {
             this.bulkActions.clear();
             if (bulkActions != null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
index fdfbc65..c393285 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassesPanel.java
@@ -64,7 +64,8 @@ public class AnyTypeClassesPanel extends TypesDirectoryPanel<AnyTypeClassTO, Any
             private static final long serialVersionUID = -6388405037134399367L;
 
             @Override
-            public ModalPanel<AnyTypeClassTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
+            public WizardModalPanel<AnyTypeClassTO> build(
+                    final String id, final int index, final AjaxWizard.Mode mode) {
                 final AnyTypeClassTO modelObject = newModelObject();
                 return new AnyTypeClassModalPanel(modal, modelObject, pageRef) {
 
@@ -88,6 +89,7 @@ public class AnyTypeClassesPanel extends TypesDirectoryPanel<AnyTypeClassTO, Any
                     }
                 };
             }
+
         }, true);
 
         initResultTable();

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
index 6b3c042..6c1d71a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypesPanel.java
@@ -65,7 +65,7 @@ public class AnyTypesPanel extends TypesDirectoryPanel<AnyTypeTO, AnyTypeProvide
             private static final long serialVersionUID = -6388405037134399367L;
 
             @Override
-            public ModalPanel<AnyTypeTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
+            public WizardModalPanel<AnyTypeTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
                 final AnyTypeTO modelObject = newModelObject();
                 return new AnyTypeModalPanel(modal, modelObject, pageRef) {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java
index 056e7fd..99dde2e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectDirectoryPanel.java
@@ -41,14 +41,13 @@ import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 
 public abstract class ConnObjectDirectoryPanel
         extends DirectoryPanel<ConnObjectTO, ConnObjectTO, ConnObjectDataProvider, ResourceRestClient>
-        implements ModalPanel<ConnObjectTO> {
+        implements ModalPanel {
 
     private static final long serialVersionUID = 4986172040062752781L;
 
@@ -84,21 +83,6 @@ public abstract class ConnObjectDirectoryPanel
     }
 
     @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public ConnObjectTO getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
     protected ConnObjectDataProvider dataProvider() {
         return new ConnObjectDataProvider(rows);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
index 3317315..f261ddc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
@@ -32,12 +31,11 @@ import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
 
-public class ConnObjects extends Panel implements ModalPanel<Serializable> {
+public class ConnObjects extends Panel implements ModalPanel {
 
     private static final long serialVersionUID = -1143512993584984838L;
 
@@ -96,21 +94,6 @@ public class ConnObjects extends Panel implements ModalPanel<Serializable> {
         });
     }
 
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Serializable getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
     private class NextableConnObjectDirectoryPanel extends ConnObjectDirectoryPanel {
 
         private static final long serialVersionUID = 956427874406567048L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
index 4207df4..b31d297 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
@@ -26,7 +26,7 @@ import org.apache.syncope.client.console.PreferenceManager;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.DirectoryDataProvider;
 import org.apache.syncope.client.console.pages.BasePage;
-import org.apache.syncope.client.console.rest.BaseRestClient;
+import org.apache.syncope.client.console.rest.RestClient;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
@@ -44,7 +44,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public abstract class DirectoryPanel<
-        T extends Serializable, W extends Serializable, DP extends DirectoryDataProvider<T>, E extends BaseRestClient>
+        T extends Serializable, W extends Serializable, DP extends DirectoryDataProvider<T>, E extends RestClient>
         extends WizardMgtPanel<W> {
 
     private static final long serialVersionUID = -9170191461250434024L;
@@ -309,7 +309,7 @@ public abstract class DirectoryPanel<
 
     protected abstract Collection<ActionLink.ActionType> getBulkActions();
 
-    public abstract static class Builder<T extends Serializable, W extends Serializable, E extends BaseRestClient>
+    public abstract static class Builder<T extends Serializable, W extends Serializable, E extends RestClient>
             extends WizardMgtPanel.Builder<W> {
 
         private static final long serialVersionUID = 5088962796986706805L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
index ecf64c9..5aac8b3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
@@ -21,13 +21,11 @@ package org.apache.syncope.client.console.panels;
 import java.io.Serializable;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 
-public class FailureMessageModal<T extends Serializable> extends Panel implements ModalPanel<T> {
+public class FailureMessageModal<T extends Serializable> extends Panel implements ModalPanel {
 
     private static final long serialVersionUID = 9216117990503199258L;
 
@@ -41,19 +39,4 @@ public class FailureMessageModal<T extends Serializable> extends Panel implement
         }
         add(executionFailureMessage.setOutputMarkupId(true));
     }
-
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public T getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java
index ef1e015..eb6df35 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalPanel.java
@@ -19,15 +19,7 @@
 package org.apache.syncope.client.console.panels;
 
 import java.io.Serializable;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.request.component.IRequestableComponent;
 
-public interface ModalPanel<T extends Serializable> extends IRequestableComponent, Serializable {
-
-    void onSubmit(AjaxRequestTarget target, Form<?> form);
-
-    void onError(AjaxRequestTarget target, Form<?> form);
-
-    T getItem();
+public interface ModalPanel extends IRequestableComponent, Serializable {
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
index 5c83530..32cbe72 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersPanel.java
@@ -100,7 +100,7 @@ public class ParametersPanel extends DirectoryPanel<
             private static final long serialVersionUID = 1995192603527154740L;
 
             @Override
-            public ModalPanel<AttrTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
+            public WizardModalPanel<AttrTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
                 return new ParametersCreateModalPanel(modal, newModelObject(), pageRef);
             }
         }, true);

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
index 314ce42..1eabedb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RelationshipTypesPanel.java
@@ -66,7 +66,8 @@ public class RelationshipTypesPanel extends TypesDirectoryPanel<RelationshipType
             private static final long serialVersionUID = -6388405037134399367L;
 
             @Override
-            public ModalPanel<RelationshipTypeTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
+            public WizardModalPanel<RelationshipTypeTO> build(
+                    final String id, final int index, final AjaxWizard.Mode mode) {
                 final RelationshipTypeTO modelObject = newModelObject();
                 return new RelationshipTypeModalPanel(modal, modelObject, pageRef) {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
index 7d61e47..9c2094f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
@@ -94,7 +94,7 @@ public class SchemaTypePanel extends TypesDirectoryPanel<AbstractSchemaTO, Schem
                 private static final long serialVersionUID = -6388405037134399367L;
 
                 @Override
-                public ModalPanel<AbstractSchemaTO> build(
+                public WizardModalPanel<AbstractSchemaTO> build(
                         final String id, final int index, final AjaxWizard.Mode mode) {
                     final AbstractSchemaTO modelObject = newModelObject();
                     return new SchemaModalPanel(modal, modelObject, pageRef) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
index 50ae8c9..be9cdf1 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SecurityQuestionsPanel.java
@@ -74,7 +74,8 @@ public class SecurityQuestionsPanel extends DirectoryPanel<
             private static final long serialVersionUID = -6388405037134399367L;
 
             @Override
-            public ModalPanel<SecurityQuestionTO> build(final String id, final int index, final AjaxWizard.Mode mode) {
+            public WizardModalPanel<SecurityQuestionTO> build(
+                    final String id, final int index, final AjaxWizard.Mode mode) {
                 final SecurityQuestionTO modelObject = newModelObject();
                 return new SecurityQuestionsModalPanel(modal, modelObject, pageRef);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/StartAtTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/StartAtTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/StartAtTogglePanel.java
new file mode 100644
index 0000000..bae12a6
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/StartAtTogglePanel.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import java.io.Serializable;
+import java.util.Date;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.rest.ExecutionRestClient;
+import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.DateTimeFieldPanel;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.Model;
+
+public abstract class StartAtTogglePanel extends TogglePanel<Serializable> {
+
+    private static final long serialVersionUID = -3195479265440591519L;
+
+    private String key = null;
+
+    public StartAtTogglePanel(final WebMarkupContainer container) {
+        super("startAt");
+
+        final Form<?> form = new Form<>("startAtForm");
+        addInnerObject(form);
+
+        final Model<Date> startAtDateModel = new Model<>();
+
+        final DateTimeFieldPanel startAtDate = new DateTimeFieldPanel(
+                "startAtDate", "startAtDate", startAtDateModel, SyncopeConstants.DATE_PATTERNS[3]);
+
+        startAtDate.setReadOnly(true).hideLabel();
+        form.add(startAtDate);
+
+        final AjaxCheckBoxPanel startAtCheck = new AjaxCheckBoxPanel(
+                "startAtCheck", "startAtCheck", new Model<>(false), false);
+
+        form.add(startAtCheck);
+
+        startAtCheck.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                target.add(startAtDate.setModelObject(null).setReadOnly(!startAtCheck.getModelObject()));
+            }
+        });
+
+        form.add(new AjaxSubmitLink("startAt", form) {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+                try {
+                    getRestClient().startExecution(key, startAtDateModel.getObject());
+                    info(getString(Constants.OPERATION_SUCCEEDED));
+                    toggle(target, false);
+                    target.add(container);
+                } catch (SyncopeClientException e) {
+                    error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+                    LOG.error("While running propagation task {}", key, e);
+                }
+                SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+            }
+
+            @Override
+            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+                SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+            }
+
+        });
+    }
+
+    public void setExecutionDetail(final String key, final String header, final AjaxRequestTarget target) {
+        this.key = key;
+        setHeader(target, header);
+    }
+
+    protected abstract ExecutionRestClient getRestClient();
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/SubmitableModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SubmitableModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SubmitableModalPanel.java
new file mode 100644
index 0000000..a7ce5dd
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SubmitableModalPanel.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+
+public interface SubmitableModalPanel extends ModalPanel {
+
+    void onSubmit(final AjaxRequestTarget target, final Form<?> form);
+
+    void onError(final AjaxRequestTarget target, final Form<?> form);
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
index f2a32c2..17a8535 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/TypeExtensionDirectoryPanel.java
@@ -54,7 +54,7 @@ import org.apache.wicket.model.StringResourceModel;
 
 public class TypeExtensionDirectoryPanel
         extends DirectoryPanel<TypeExtensionTO, TypeExtensionTO, TypeExtensionDataProvider, BaseRestClient>
-        implements ModalPanel<Serializable> {
+        implements SubmitableModalPanel {
 
     private static final long serialVersionUID = -4117015319209624858L;
 
@@ -172,11 +172,6 @@ public class TypeExtensionDirectoryPanel
         return Collections.emptyList();
     }
 
-    @Override
-    public TypeExtensionTO getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
     protected class TypeExtensionDataProvider extends DirectoryDataProvider<TypeExtensionTO> {
 
         private static final long serialVersionUID = 4533123471004692755L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/panels/WizardModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/WizardModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/WizardModalPanel.java
new file mode 100644
index 0000000..706e9f5
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/WizardModalPanel.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.panels;
+
+import java.io.Serializable;
+
+public interface WizardModalPanel<T extends Serializable> extends ModalPanel {
+
+    T getItem();
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
new file mode 100644
index 0000000..f2055b9
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportDirectoryPanel.java
@@ -0,0 +1,261 @@
+/*
+ * 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.reports;
+
+import static org.apache.wicket.Component.ENABLE;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.panels.DirectoryPanel;
+import org.apache.syncope.client.console.panels.MultilevelPanel;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+/**
+ * Reports page.
+ */
+public abstract class ReportDirectoryPanel
+        extends DirectoryPanel<ReportTO, ReportTO, DirectoryDataProvider<ReportTO>, ReportRestClient> {
+
+    private static final long serialVersionUID = 4984337552918213290L;
+
+    private final ReportStartAtTogglePanel startAt;
+
+    protected ReportDirectoryPanel(final MultilevelPanel multiLevelPanelRef, final PageReference pageRef) {
+        super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, true);
+        this.restClient = new ReportRestClient();
+
+        this.addNewItemPanelBuilder(new ReportWizardBuilder(new ReportTO(), pageRef), true);
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.REPORT_CREATE);
+
+        initResultTable();
+
+        startAt = new ReportStartAtTogglePanel(container);
+        addInnerObject(startAt);
+    }
+
+    @Override
+    protected List<IColumn<ReportTO, String>> getColumns() {
+        final List<IColumn<ReportTO, String>> columns = new ArrayList<>();
+
+        columns.add(new KeyPropertyColumn<ReportTO>(
+                new StringResourceModel("key", this, null), "key", "key"));
+
+        columns.add(new PropertyColumn<ReportTO, String>(new StringResourceModel(
+                "name", this, null), "name", "name"));
+
+        columns.add(new DatePropertyColumn<ReportTO>(
+                new StringResourceModel("lastExec", this, null), "lastExec", "lastExec"));
+
+        columns.add(new DatePropertyColumn<ReportTO>(
+                new StringResourceModel("nextExec", this, null), "nextExec", "nextExec"));
+
+        columns.add(new DatePropertyColumn<ReportTO>(
+                new StringResourceModel("start", this, null), "start", "start"));
+
+        columns.add(new DatePropertyColumn<ReportTO>(
+                new StringResourceModel("end", this, null), "end", "end"));
+
+        columns.add(new PropertyColumn<ReportTO, String>(
+                new StringResourceModel("latestExecStatus", this, null), "latestExecStatus", "latestExecStatus"));
+
+        columns.add(new BooleanPropertyColumn<ReportTO>(
+                new StringResourceModel("active", this, null), "active", "active"));
+
+        columns.add(new ActionColumn<ReportTO, String>(new ResourceModel("actions")) {
+
+            private static final long serialVersionUID = 2054811145491901166L;
+
+            @Override
+            public ActionLinksPanel<ReportTO> getActions(final String componentId, final IModel<ReportTO> model) {
+
+                final ReportTO reportTO = model.getObject();
+
+                final ActionLinksPanel<ReportTO> panel = ActionLinksPanel.<ReportTO>builder().
+                        add(new ActionLink<ReportTO>() {
+
+                            private static final long serialVersionUID = -3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) {
+                                final ReportTO clone = SerializationUtils.clone(model.getObject());
+                                clone.setKey(null);
+                                send(ReportDirectoryPanel.this, Broadcast.EXACT,
+                                        new AjaxWizard.EditItemActionEvent<>(clone, target));
+                            }
+                        }, ActionLink.ActionType.CLONE, StandardEntitlement.REPORT_CREATE).
+                        add(new ActionLink<ReportTO>() {
+
+                            private static final long serialVersionUID = -3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) {
+                                send(ReportDirectoryPanel.this, Broadcast.EXACT,
+                                        new AjaxWizard.EditItemActionEvent<>(
+                                                restClient.read(model.getObject().getKey()), target));
+                            }
+                        }, ActionLink.ActionType.EDIT, StandardEntitlement.REPORT_UPDATE).
+                        add(new ActionLink<ReportTO>() {
+
+                            private static final long serialVersionUID = -3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) {
+                                viewTask(reportTO, target);
+                            }
+                        }, ActionLink.ActionType.VIEW, StandardEntitlement.REPORT_READ).
+                        add(new ActionLink<ReportTO>() {
+
+                            private static final long serialVersionUID = -3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final ReportTO ignore) {
+                                startAt.setExecutionDetail(
+                                        model.getObject().getKey(), model.getObject().getName(), target);
+                                startAt.toggle(target, true);
+                            }
+                        }, ActionLink.ActionType.EXECUTE, StandardEntitlement.REPORT_EXECUTE).
+                        add(new ActionLink<ReportTO>() {
+
+                            private static final long serialVersionUID = -3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final ReportTO modelObject) {
+                                try {
+                                    restClient.delete(reportTO.getKey());
+                                    info(getString(Constants.OPERATION_SUCCEEDED));
+                                    target.add(container);
+                                } catch (SyncopeClientException e) {
+                                    LOG.error("While deleting {}", reportTO.getKey(), e);
+                                    error(StringUtils.isBlank(e.getMessage())
+                                            ? e.getClass().getName() : e.getMessage());
+                                }
+                                SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+                            }
+                        }, ActionLink.ActionType.DELETE, StandardEntitlement.REPORT_DELETE).build(componentId);
+
+                return panel;
+            }
+
+            @Override
+            public ActionLinksPanel<ReportTO> getHeader(final String componentId) {
+                final ActionLinksPanel.Builder<ReportTO> panel = ActionLinksPanel.builder();
+
+                return panel.add(new ActionLink<ReportTO>() {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ReportTO ignore) {
+                        if (target != null) {
+                            target.add(container);
+                        }
+                    }
+                }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);
+            }
+        });
+
+        return columns;
+    }
+
+    @Override
+    protected Collection<ActionType> getBulkActions() {
+        final List<ActionType> bulkActions = new ArrayList<>();
+        bulkActions.add(ActionType.EXECUTE);
+        bulkActions.add(ActionType.DELETE);
+        return bulkActions;
+    }
+
+    @Override
+    protected ReportDataProvider dataProvider() {
+        return new ReportDataProvider(rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_PROPAGATION_TASKS_PAGINATOR_ROWS;
+    }
+
+    protected abstract void viewTask(final ReportTO reportTO, final AjaxRequestTarget target);
+
+    protected class ReportDataProvider extends DirectoryDataProvider<ReportTO> {
+
+        private static final long serialVersionUID = 4725679400450513556L;
+
+        private final SortableDataProviderComparator<ReportTO> comparator;
+
+        private final List<ReportTO> reports;
+
+        public ReportDataProvider(final int paginatorRows) {
+            super(paginatorRows);
+            this.reports = restClient.list();
+
+            //Default sorting
+            setSort("key", SortOrder.DESCENDING);
+            comparator = new SortableDataProviderComparator<>(this);
+
+            Collections.sort(this.reports, comparator);
+        }
+
+        @Override
+        public Iterator<ReportTO> iterator(final long first, final long count) {
+            return this.reports.subList((int) first, (int) (first + count)).iterator();
+        }
+
+        @Override
+        public long size() {
+            return reports.size();
+        }
+
+        @Override
+        public IModel<ReportTO> model(final ReportTO object) {
+            return new CompoundPropertyModel<>(object);
+        }
+    }
+}


[3/4] syncope git commit: [SYNCOPE-745] report management + refactoring ModalPanel interface; still missing reportlets

Posted by fm...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java
new file mode 100644
index 0000000..7866000
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportExecutionDetails.java
@@ -0,0 +1,54 @@
+/*
+ * 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.reports;
+
+import org.apache.syncope.client.console.panels.MultilevelPanel;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.client.console.tasks.ExecutionsDirectoryPanel;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+
+/**
+ * Modal window with report executions.
+ */
+public class ReportExecutionDetails extends MultilevelPanel.SecondLevel {
+
+    private static final long serialVersionUID = -4110576026663173545L;
+
+    public ReportExecutionDetails(final ReportTO reportTO, final PageReference pageRef) {
+        super();
+
+        final MultilevelPanel mlp = new MultilevelPanel("executions");
+        add(mlp);
+
+        mlp.setFirstLevel(new ExecutionsDirectoryPanel(mlp, reportTO.getKey(), new ReportRestClient(), pageRef) {
+
+            private static final long serialVersionUID = 5691719817252887541L;
+
+            @Override
+            protected void next(
+                    final String title,
+                    final MultilevelPanel.SecondLevel slevel,
+                    final AjaxRequestTarget target) {
+                mlp.next(title, slevel, target);
+            }
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportStartAtTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportStartAtTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportStartAtTogglePanel.java
new file mode 100644
index 0000000..04022fa
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportStartAtTogglePanel.java
@@ -0,0 +1,39 @@
+/*
+ * 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.reports;
+
+import org.apache.syncope.client.console.panels.StartAtTogglePanel;
+import org.apache.syncope.client.console.rest.ExecutionRestClient;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+
+public class ReportStartAtTogglePanel extends StartAtTogglePanel {
+
+    private static final long serialVersionUID = -3195479265440591519L;
+
+    public ReportStartAtTogglePanel(final WebMarkupContainer container) {
+        super(container);
+    }
+
+    @Override
+    protected ExecutionRestClient getRestClient() {
+        return new ReportRestClient();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
new file mode 100644
index 0000000..497a4bd
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportTemplateDirectoryPanel.java
@@ -0,0 +1,251 @@
+/*
+ * 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.reports;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.notifications.TemplateContentModal;
+import org.apache.syncope.client.console.notifications.TemplateModal;
+import org.apache.syncope.client.console.panels.DirectoryPanel;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AbstractModalPanelBuilder;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.ReportTemplateTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+import org.apache.syncope.client.console.panels.WizardModalPanel;
+import org.apache.syncope.client.console.reports.ReportTemplateDirectoryPanel.ReportTemplateProvider;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.common.lib.types.ReportTemplateFormat;
+
+public class ReportTemplateDirectoryPanel
+        extends DirectoryPanel<ReportTemplateTO, ReportTemplateTO, ReportTemplateProvider, ReportRestClient> {
+
+    private static final long serialVersionUID = -3789392431954221446L;
+
+    protected final BaseModal<Serializable> utilityModal = new BaseModal<>("outer");
+
+    public ReportTemplateDirectoryPanel(final String id, final PageReference pageReference) {
+        super(id, pageReference, true);
+        disableCheckBoxes();
+
+        modal.size(Modal.Size.Small);
+        modal.addSubmitButton();
+        setFooterVisibility(true);
+
+        addOuterObject(utilityModal);
+        setWindowClosedReloadCallback(utilityModal);
+        utilityModal.size(Modal.Size.Large);
+        utilityModal.addSubmitButton();
+
+        restClient = new ReportRestClient();
+        addNewItemPanelBuilder(new AbstractModalPanelBuilder<ReportTemplateTO>(new ReportTemplateTO(), pageRef) {
+
+            private static final long serialVersionUID = 1995192603527154740L;
+
+            @Override
+            public WizardModalPanel<ReportTemplateTO> build(
+                    final String id, final int index, final AjaxWizard.Mode mode) {
+                return new TemplateModal<ReportTemplateTO, ReportTemplateFormat>(
+                        modal, restClient, new ReportTemplateTO(), pageReference);
+            }
+        }, true);
+
+        initResultTable();
+
+        MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, ENABLE, StandardEntitlement.MAIL_TEMPLATE_CREATE);
+    }
+
+    @Override
+    protected List<IColumn<ReportTemplateTO, String>> getColumns() {
+        List<IColumn<ReportTemplateTO, String>> columns = new ArrayList<>();
+        columns.add(new PropertyColumn<ReportTemplateTO, String>(
+                new StringResourceModel("key", this, null), "key", "key"));
+
+        columns.add(new ActionColumn<ReportTemplateTO, String>(new ResourceModel("actions", "")) {
+
+            private static final long serialVersionUID = -3503023501954863131L;
+
+            @Override
+            public ActionLinksPanel<ReportTemplateTO> getActions(
+                    final String componentId, final IModel<ReportTemplateTO> model) {
+
+                final ActionLinksPanel.Builder<ReportTemplateTO> panel = ActionLinksPanel.builder();
+
+                panel.add(new ActionLink<ReportTemplateTO>() {
+
+                    private static final long serialVersionUID = -7978723352517770645L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ReportTemplateTO ignore) {
+                        TemplateContentModal.TemplateContent<ReportTemplateFormat> content
+                                = new TemplateContentModal.TemplateContent<ReportTemplateFormat>(
+                                        model.getObject().getKey(), ReportTemplateFormat.FO);
+                        content.setContent(
+                                restClient.readTemplateFormat(model.getObject().getKey(), ReportTemplateFormat.FO));
+
+                        utilityModal.header(new ResourceModel("report.template.fo", "FO Content"));
+                        utilityModal.setContent(new TemplateContentModal<ReportTemplateTO, ReportTemplateFormat>(
+                                utilityModal, restClient, content, pageRef));
+                        utilityModal.show(true);
+                        target.add(utilityModal);
+                    }
+                }, ActionLink.ActionType.FO_EDIT, StandardEntitlement.MAIL_TEMPLATE_UPDATE);
+
+                panel.add(new ActionLink<ReportTemplateTO>() {
+
+                    private static final long serialVersionUID = -7978723352517770645L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ReportTemplateTO ignore) {
+                        TemplateContentModal.TemplateContent<ReportTemplateFormat> content
+                                = new TemplateContentModal.TemplateContent<ReportTemplateFormat>(
+                                        model.getObject().getKey(), ReportTemplateFormat.HTML);
+                        content.setContent(
+                                restClient.readTemplateFormat(model.getObject().getKey(), ReportTemplateFormat.HTML));
+
+                        utilityModal.header(new ResourceModel("report.template.html", "HTML Content"));
+                        utilityModal.setContent(new TemplateContentModal<ReportTemplateTO, ReportTemplateFormat>(
+                                utilityModal, restClient, content, pageRef));
+                        utilityModal.show(true);
+                        target.add(utilityModal);
+                    }
+                }, ActionLink.ActionType.HTML_EDIT, StandardEntitlement.MAIL_TEMPLATE_UPDATE);
+
+                panel.add(new ActionLink<ReportTemplateTO>() {
+
+                    private static final long serialVersionUID = -7978723352517770645L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ReportTemplateTO ignore) {
+                        TemplateContentModal.TemplateContent<ReportTemplateFormat> content
+                                = new TemplateContentModal.TemplateContent<ReportTemplateFormat>(
+                                        model.getObject().getKey(), ReportTemplateFormat.CSV);
+                        content.setContent(
+                                restClient.readTemplateFormat(model.getObject().getKey(), ReportTemplateFormat.CSV));
+
+                        utilityModal.setFormModel(content);
+                        utilityModal.header(new ResourceModel("report.template.text", "TEXT Content"));
+                        utilityModal.setContent(new TemplateContentModal<ReportTemplateTO, ReportTemplateFormat>(
+                                utilityModal, restClient, content, pageRef));
+                        utilityModal.show(true);
+                        target.add(utilityModal);
+                    }
+                }, ActionLink.ActionType.TEXT_EDIT, StandardEntitlement.MAIL_TEMPLATE_UPDATE);
+
+                panel.add(new ActionLink<ReportTemplateTO>() {
+
+                    private static final long serialVersionUID = -3722207913631435501L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final ReportTemplateTO ignore) {
+                        try {
+                            restClient.deleteTemplate(model.getObject().getKey());
+                            info(getString(Constants.OPERATION_SUCCEEDED));
+                            target.add(container);
+                        } catch (SyncopeClientException e) {
+                            LOG.error("While deleting object {}", model.getObject().getKey(), e);
+                            error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
+                        }
+                        SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+                    }
+                }, ActionLink.ActionType.DELETE, StandardEntitlement.MAIL_TEMPLATE_DELETE);
+
+                return panel.build(componentId);
+            }
+        });
+        return columns;
+    }
+
+    @Override
+    protected ReportTemplateProvider dataProvider() {
+        return new ReportTemplateProvider(rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_MAIL_TEMPLATE_PAGINATOR_ROWS;
+    }
+
+    @Override
+    protected Collection<ActionLink.ActionType> getBulkActions() {
+        return Collections.<ActionLink.ActionType>emptyList();
+    }
+
+    public class ReportTemplateProvider extends DirectoryDataProvider<ReportTemplateTO> {
+
+        private static final long serialVersionUID = -276043813563988590L;
+
+        private final SortableDataProviderComparator<ReportTemplateTO> comparator;
+
+        public ReportTemplateProvider(final int paginatorRows) {
+            super(paginatorRows);
+            setSort("key", SortOrder.ASCENDING);
+            comparator = new SortableDataProviderComparator<>(this);
+        }
+
+        @Override
+        public Iterator<ReportTemplateTO> iterator(final long first, final long count) {
+            final List<ReportTemplateTO> list = restClient.getAllAvailableTemplates();
+            Collections.sort(list, comparator);
+            return list.subList((int) first, (int) first + (int) count).iterator();
+        }
+
+        @Override
+        public long size() {
+            return restClient.getAllAvailableTemplates().size();
+        }
+
+        @Override
+        public IModel<ReportTemplateTO> model(final ReportTemplateTO reportTemplateTO) {
+            return new AbstractReadOnlyModel<ReportTemplateTO>() {
+
+                private static final long serialVersionUID = 774694801558497248L;
+
+                @Override
+                public ReportTemplateTO getObject() {
+                    return reportTemplateTO;
+                }
+            };
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
new file mode 100644
index 0000000..6a12244
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
@@ -0,0 +1,108 @@
+/*
+ * 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.reports;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.client.console.tasks.CrontabPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
+import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.syncope.common.lib.to.ReportTemplateTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.model.PropertyModel;
+
+public class ReportWizardBuilder extends AjaxWizardBuilder<ReportTO> {
+
+    private static final long serialVersionUID = 5945391813567245081L;
+
+    private final ReportRestClient restClient = new ReportRestClient();
+
+    public ReportWizardBuilder(final ReportTO reportTO, final PageReference pageRef) {
+        super(reportTO, pageRef);
+    }
+
+    @Override
+    protected Serializable onApplyInternal(final ReportTO modelObject) {
+        if (modelObject.getKey() == null) {
+            restClient.create(modelObject);
+        } else {
+            restClient.update(modelObject);
+        }
+        return modelObject;
+    }
+
+    @Override
+    protected WizardModel buildModelSteps(final ReportTO modelObject, final WizardModel wizardModel) {
+        wizardModel.add(new Profile(modelObject));
+        wizardModel.add(new Schedule(modelObject));
+        return wizardModel;
+    }
+
+    public class Profile extends WizardStep {
+
+        private static final long serialVersionUID = -3043839139187792810L;
+
+        public Profile(final ReportTO reportTO) {
+
+            AjaxTextFieldPanel name = new AjaxTextFieldPanel(
+                    "name", "name", new PropertyModel<String>(reportTO, "name"), false);
+            name.addRequiredLabel();
+            name.setEnabled(true);
+            add(name);
+
+            final AjaxDropDownChoicePanel<String> template = new AjaxDropDownChoicePanel<>(
+                    "template", getString("template"),
+                    new PropertyModel<String>(reportTO, "template"));
+            template.setChoices(CollectionUtils.collect(
+                    restClient.getAllAvailableTemplates(), new Transformer<ReportTemplateTO, String>() {
+
+                @Override
+                public String transform(final ReportTemplateTO input) {
+                    return input.getKey();
+                }
+            }, new ArrayList<String>()));
+
+            template.addRequiredLabel();
+            add(template);
+
+            AjaxCheckBoxPanel active = new AjaxCheckBoxPanel(
+                    "active", "active", new PropertyModel<Boolean>(reportTO, "active"), false);
+            add(active);
+        }
+    }
+
+    public class Schedule extends WizardStep {
+
+        private static final long serialVersionUID = -785981096328637758L;
+
+        public Schedule(final ReportTO reportTO) {
+            add(new CrontabPanel(
+                    "schedule", new PropertyModel<String>(reportTO, "cronExpression"), reportTO.getCronExpression()));
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
index 83a0951..9eaa65d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.rest;
 
-import java.io.Serializable;
 import java.net.URI;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
@@ -31,7 +30,7 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class BaseRestClient implements Serializable {
+public abstract class BaseRestClient implements RestClient {
 
     protected static final Logger LOG = LoggerFactory.getLogger(BaseRestClient.class);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
index 1bb0ad9..aa0d59a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ExecutionRestClient.java
@@ -22,11 +22,15 @@ import java.util.Date;
 import java.util.List;
 import org.apache.syncope.common.lib.to.ExecTO;
 
-public interface ExecutionRestClient {
+public interface ExecutionRestClient extends RestClient {
 
     void startExecution(String executionCollectorKey, Date start);
 
     void deleteExecution(String executionKey);
 
     List<ExecTO> listRecentExecutions(final int max);
+
+    List<ExecTO> listExecutions(final String taskKey, final int page, final int size);
+
+    int countExecutions(final String taskKey);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/rest/NotificationRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/NotificationRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/NotificationRestClient.java
index eb7d160..eab0a17 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/NotificationRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/NotificationRestClient.java
@@ -29,7 +29,8 @@ import org.apache.syncope.common.lib.types.MailTemplateFormat;
 import org.apache.syncope.common.rest.api.service.MailTemplateService;
 import org.apache.syncope.common.rest.api.service.NotificationService;
 
-public class NotificationRestClient extends BaseRestClient {
+public class NotificationRestClient extends BaseRestClient
+        implements TemplateRestClient<MailTemplateTO, MailTemplateFormat> {
 
     private static final long serialVersionUID = 6328933265096511690L;
 
@@ -53,22 +54,27 @@ public class NotificationRestClient extends BaseRestClient {
         getService(NotificationService.class).delete(key);
     }
 
+    @Override
     public List<MailTemplateTO> getAllAvailableTemplates() {
         return getService(MailTemplateService.class).list();
     }
 
+    @Override
     public void createTemplate(final MailTemplateTO mailTemplateTO) {
         getService(MailTemplateService.class).create(mailTemplateTO);
     }
 
+    @Override
     public void deleteTemplate(final String key) {
         getService(MailTemplateService.class).delete(key);
     }
 
+    @Override
     public MailTemplateTO readTemplate(final String key) {
         return getService(MailTemplateService.class).read(key);
     }
 
+    @Override
     public String readTemplateFormat(final String key, final MailTemplateFormat format) {
         try {
             return IOUtils.toString(InputStream.class.cast(
@@ -80,6 +86,7 @@ public class NotificationRestClient extends BaseRestClient {
         }
     }
 
+    @Override
     public void updateTemplateFormat(final String key, final String content, final MailTemplateFormat format) {
         getService(MailTemplateService.class).setFormat(
                 key, format, IOUtils.toInputStream(content, SyncopeConstants.DEFAULT_CHARSET));

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
index 743ebfb..1c59d09 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
@@ -18,16 +18,27 @@
  */
 package org.apache.syncope.client.console.rest;
 
+import static org.apache.syncope.client.console.rest.BaseRestClient.getService;
+
+import java.io.InputStream;
 import java.util.Date;
 import java.util.List;
 import javax.ws.rs.core.Response;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.ReportTO;
+import org.apache.syncope.common.lib.to.ReportTemplateTO;
 import org.apache.syncope.common.lib.types.ReportExecExportFormat;
+import org.apache.syncope.common.lib.types.ReportTemplateFormat;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecuteQuery;
 import org.apache.syncope.common.rest.api.service.ReportService;
+import org.apache.syncope.common.rest.api.service.ReportTemplateService;
 
-public class ReportRestClient extends BaseRestClient implements ExecutionRestClient {
+public class ReportRestClient extends BaseRestClient
+        implements ExecutionRestClient, TemplateRestClient<ReportTemplateTO, ReportTemplateFormat> {
 
     private static final long serialVersionUID = 1644689667998953604L;
 
@@ -74,4 +85,54 @@ public class ReportRestClient extends BaseRestClient implements ExecutionRestCli
     public Response exportExecutionResult(final String executionKey, final ReportExecExportFormat fmt) {
         return getService(ReportService.class).exportExecutionResult(executionKey, fmt);
     }
+
+    @Override
+    public List<ExecTO> listExecutions(final String taskKey, final int page, final int size) {
+        return getService(ReportService.class).
+                listExecutions(new ExecQuery.Builder().key(taskKey).page(page).size(size).build()).getResult();
+    }
+
+    @Override
+    public int countExecutions(final String taskKey) {
+        return getService(ReportService.class).
+                listExecutions(new ExecQuery.Builder().key(taskKey).page(1).size(1).build()).getTotalCount();
+    }
+
+    @Override
+    public List<ReportTemplateTO> getAllAvailableTemplates() {
+        return getService(ReportTemplateService.class).list();
+    }
+
+    @Override
+    public void createTemplate(final ReportTemplateTO reportTemplateTO) {
+        getService(ReportTemplateService.class).create(reportTemplateTO);
+    }
+
+    @Override
+    public void deleteTemplate(final String key) {
+        getService(ReportTemplateService.class).delete(key);
+    }
+
+    @Override
+    public ReportTemplateTO readTemplate(final String key) {
+        return getService(ReportTemplateService.class).read(key);
+    }
+
+    @Override
+    public String readTemplateFormat(final String key, final ReportTemplateFormat format) {
+        try {
+            return IOUtils.toString(InputStream.class.cast(
+                    getService(ReportTemplateService.class).getFormat(key, format).getEntity()),
+                    SyncopeConstants.DEFAULT_CHARSET);
+        } catch (Exception e) {
+            LOG.error("Error retrieving mail template {} as {}", key, format, e);
+            return StringUtils.EMPTY;
+        }
+    }
+
+    @Override
+    public void updateTemplateFormat(final String key, final String content, final ReportTemplateFormat format) {
+        getService(ReportTemplateService.class).setFormat(
+                key, format, IOUtils.toInputStream(content, SyncopeConstants.DEFAULT_CHARSET));
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/rest/RestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/RestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/RestClient.java
new file mode 100644
index 0000000..4ac954c
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/RestClient.java
@@ -0,0 +1,24 @@
+/*
+ * 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.rest;
+
+import java.io.Serializable;
+
+public interface RestClient extends Serializable {
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
index abc62a6..0c70c44 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
@@ -61,6 +61,7 @@ public class TaskRestClient extends BaseRestClient implements ExecutionRestClien
                 build()).getTotalCount();
     }
 
+    @Override
     public int countExecutions(final String taskKey) {
         return getService(TaskService.class).
                 listExecutions(new ExecQuery.Builder().key(taskKey).page(1).size(1).build()).getTotalCount();
@@ -139,6 +140,7 @@ public class TaskRestClient extends BaseRestClient implements ExecutionRestClien
                 getResult();
     }
 
+    @Override
     public List<ExecTO> listExecutions(final String taskKey, final int page, final int size) {
         return getService(TaskService.class).
                 listExecutions(new ExecQuery.Builder().key(taskKey).page(page).size(size).build()).getResult();

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/rest/TemplateRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/TemplateRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/TemplateRestClient.java
new file mode 100644
index 0000000..9bb62b6
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/TemplateRestClient.java
@@ -0,0 +1,36 @@
+/*
+ * 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.rest;
+
+import java.util.List;
+
+public interface TemplateRestClient<T, F> extends RestClient {
+
+    List<T> getAllAvailableTemplates();
+
+    void createTemplate(final T templateTO);
+
+    void deleteTemplate(final String key);
+
+    T readTemplate(final String key);
+
+    String readTemplateFormat(final String key, final F format);
+
+    void updateTemplateFormat(final String key, final String content, final F format);
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/status/StatusDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/status/StatusDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/status/StatusDirectoryPanel.java
index f61e4ee..835e478 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/status/StatusDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/status/StatusDirectoryPanel.java
@@ -44,21 +44,19 @@ import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public class StatusDirectoryPanel
         extends DirectoryPanel<StatusBean, StatusBean, AttributableStatusProvider, AbstractAnyRestClient<?>>
-        implements ModalPanel<StatusBean> {
+        implements ModalPanel {
 
     private static final long serialVersionUID = -9148734710505211261L;
 
@@ -110,21 +108,6 @@ public class StatusDirectoryPanel
     }
 
     @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public StatusBean getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
     protected List<IColumn<StatusBean, String>> getColumns() {
         final List<IColumn<StatusBean, String>> columns = new ArrayList<>();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
index d2cf748..da05b49 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
@@ -21,14 +21,11 @@ package org.apache.syncope.client.console.status;
 import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wizards.any.AnyWrapper;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
 
-public class StatusModal<T extends AnyTO> extends Panel implements ModalPanel<AnyWrapper<T>> {
+public class StatusModal<T extends AnyTO> extends Panel implements ModalPanel {
 
     private static final long serialVersionUID = 1066124171682570080L;
 
@@ -39,19 +36,4 @@ public class StatusModal<T extends AnyTO> extends Panel implements ModalPanel<An
         final MultilevelPanel mlp = new MultilevelPanel("status");
         add(mlp.setFirstLevel(new StatusDirectoryPanel(baseModal, mlp, pageReference, anyTO, statusOnly)));
     }
-
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public AnyWrapper<T> getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/AbstractTasks.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/AbstractTasks.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/AbstractTasks.java
index 93b2a2a..dc947f2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/AbstractTasks.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/AbstractTasks.java
@@ -18,32 +18,14 @@
  */
 package org.apache.syncope.client.console.tasks;
 
-import java.io.Serializable;
 import org.apache.syncope.client.console.panels.ModalPanel;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
 
-public abstract class AbstractTasks extends Panel implements ModalPanel<Serializable> {
+public abstract class AbstractTasks extends Panel implements ModalPanel {
 
     private static final long serialVersionUID = -4013796607157549641L;
 
     public AbstractTasks(final String id) {
         super(id);
     }
-
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Serializable getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
new file mode 100644
index 0000000..10545f1
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
@@ -0,0 +1,232 @@
+/*
+ * 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.tasks;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.DirectoryDataProvider;
+import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
+import org.apache.syncope.client.console.panels.DirectoryPanel;
+import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
+import org.apache.syncope.client.console.panels.MultilevelPanel;
+import org.apache.syncope.client.console.panels.MultilevelPanel.SecondLevel;
+import org.apache.syncope.client.console.rest.ExecutionRestClient;
+import org.apache.syncope.client.console.tasks.ExecutionsDirectoryPanel.ExecProvider;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.ExecTO;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+public abstract class ExecutionsDirectoryPanel
+        extends DirectoryPanel<ExecTO, ExecTO, ExecProvider, ExecutionRestClient> {
+
+    private static final long serialVersionUID = 2039393934721149162L;
+
+    private final BaseModal<?> baseModal;
+
+    private final MultilevelPanel multiLevelPanelRef;
+
+    private final String key;
+
+    public ExecutionsDirectoryPanel(
+            final MultilevelPanel multiLevelPanelRef,
+            final String key,
+            final ExecutionRestClient executionRestClient,
+            final PageReference pageRef) {
+        this(null, multiLevelPanelRef, key, executionRestClient, pageRef);
+    }
+
+    public ExecutionsDirectoryPanel(
+            final BaseModal<?> baseModal,
+            final MultilevelPanel multiLevelPanelRef,
+            final String key,
+            final ExecutionRestClient executionRestClient,
+            final PageReference pageRef) {
+        super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false);
+        this.baseModal = baseModal;
+        this.multiLevelPanelRef = multiLevelPanelRef;
+        restClient = executionRestClient;
+        setOutputMarkupId(true);
+        this.key = key;
+        initResultTable();
+    }
+
+    @Override
+    protected void resultTableCustomChanges(final AjaxDataTablePanel.Builder<ExecTO, String> resultTableBuilder) {
+        resultTableBuilder.setMultiLevelPanel(baseModal, multiLevelPanelRef);
+    }
+
+    protected abstract void next(final String title, final SecondLevel secondLevel, final AjaxRequestTarget target);
+
+    @Override
+    protected List<IColumn<ExecTO, String>> getColumns() {
+        final List<IColumn<ExecTO, String>> columns = new ArrayList<>();
+
+        columns.add(new KeyPropertyColumn<ExecTO>(new ResourceModel("key"), "key", "key"));
+
+        columns.add(new DatePropertyColumn<ExecTO>(new ResourceModel("start"), "start", "start"));
+
+        columns.add(new DatePropertyColumn<ExecTO>(new ResourceModel("end"), "end", "end"));
+
+        columns.add(new PropertyColumn<ExecTO, String>(new ResourceModel("status"), "status", "status"));
+
+        columns.add(new ActionColumn<ExecTO, String>(new ResourceModel("actions")) {
+
+            private static final long serialVersionUID = -3503023501954863131L;
+
+            @Override
+            public ActionLinksPanel<ExecTO> getActions(final String componentId, final IModel<ExecTO> model) {
+                final ExecTO taskExecutionTO = model.getObject();
+
+                final ActionLinksPanel.Builder<ExecTO> panel = ActionLinksPanel.builder();
+
+                panel.
+                        add(new ActionLink<ExecTO>() {
+
+                            private static final long serialVersionUID = -3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
+                                next(new StringResourceModel("execution.view", ExecutionsDirectoryPanel.this, model).
+                                        getObject(), new ExecMessage(model.getObject().getMessage()), target);
+                            }
+                        }, ActionLink.ActionType.VIEW, StandardEntitlement.TASK_READ).
+                        add(new ActionLink<ExecTO>() {
+
+                            private static final long serialVersionUID = -3722207913631435501L;
+
+                            @Override
+                            public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
+                                try {
+                                    restClient.deleteExecution(taskExecutionTO.getKey());
+                                    info(getString(Constants.OPERATION_SUCCEEDED));
+                                } catch (SyncopeClientException scce) {
+                                    error(scce.getMessage());
+                                }
+                                target.add(ExecutionsDirectoryPanel.this);
+                                SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
+                            }
+                        }, ActionLink.ActionType.DELETE, StandardEntitlement.TASK_DELETE);
+
+                return panel.build(componentId, model.getObject());
+            }
+
+            @Override
+            public ActionLinksPanel<Serializable> getHeader(final String componentId) {
+                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder();
+
+                return panel.add(new ActionLink<Serializable>() {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
+                        if (target != null) {
+                            target.add(container);
+                        }
+                    }
+                }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);
+            }
+        });
+
+        return columns;
+    }
+
+    @Override
+    protected ExecProvider dataProvider() {
+        return new ExecProvider(key, rows);
+    }
+
+    @Override
+    protected String paginatorRowsKey() {
+        return Constants.PREF_TASK_EXECS_PAGINATOR_ROWS;
+    }
+
+    @Override
+    protected Collection<ActionLink.ActionType> getBulkActions() {
+        final List<ActionLink.ActionType> bulkActions = new ArrayList<>();
+        bulkActions.add(ActionLink.ActionType.DELETE);
+        return bulkActions;
+    }
+
+    protected class ExecProvider extends DirectoryDataProvider<ExecTO> {
+
+        private static final long serialVersionUID = 8943636537120648961L;
+
+        private final SortableDataProviderComparator<ExecTO> comparator;
+
+        private final String taskKey;
+
+        public ExecProvider(final String taskKey, final int paginatorRows) {
+            super(paginatorRows);
+            this.taskKey = taskKey;
+            comparator = new SortableDataProviderComparator<>(this);
+        }
+
+        public SortableDataProviderComparator<ExecTO> getComparator() {
+            return comparator;
+        }
+
+        @Override
+        public Iterator<ExecTO> iterator(final long first, final long count) {
+            final int page = ((int) first / paginatorRows);
+            List<ExecTO> list = restClient.listExecutions(taskKey, (page < 0 ? 0 : page) + 1, paginatorRows);
+            Collections.sort(list, comparator);
+            return list.iterator();
+        }
+
+        @Override
+        public long size() {
+            return restClient.countExecutions(taskKey);
+        }
+
+        @Override
+        public IModel<ExecTO> model(final ExecTO taskExecution) {
+
+            return new AbstractReadOnlyModel<ExecTO>() {
+
+                private static final long serialVersionUID = 7485475149862342421L;
+
+                @Override
+                public ExecTO getObject() {
+                    return taskExecution;
+                }
+            };
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
index 03d62e7..6d8d6c7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/NotificationTaskDirectoryPanel.java
@@ -50,7 +50,7 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public abstract class NotificationTaskDirectoryPanel
-        extends TaskDirectoryPanel<NotificationTaskTO> implements ModalPanel<NotificationTaskTO> {
+        extends TaskDirectoryPanel<NotificationTaskTO> implements ModalPanel {
 
     private static final long serialVersionUID = 4984337552918213290L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
index da36a28..2e83e6e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PropagationTaskDirectoryPanel.java
@@ -53,7 +53,7 @@ import org.apache.wicket.model.StringResourceModel;
  * Tasks page.
  */
 public abstract class PropagationTaskDirectoryPanel
-        extends TaskDirectoryPanel<PropagationTaskTO> implements ModalPanel<PropagationTaskTO> {
+        extends TaskDirectoryPanel<PropagationTaskTO> implements ModalPanel {
 
     private static final long serialVersionUID = 4984337552918213290L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
index 709205a..14fc503 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
@@ -62,7 +62,7 @@ import org.apache.wicket.model.StringResourceModel;
  * @param <T> Sched task type.
  */
 public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO>
-        extends TaskDirectoryPanel<T> implements ModalPanel<T> {
+        extends TaskDirectoryPanel<T> implements ModalPanel {
 
     private static final long serialVersionUID = 4984337552918213290L;
 
@@ -70,7 +70,7 @@ public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO>
 
     protected T schedTaskTO;
 
-    private final StartAtTogglePanel startAt;
+    private final TaskStartAtTogglePanel startAt;
 
     protected SchedTaskDirectoryPanel(
             final BaseModal<?> baseModal,
@@ -92,7 +92,7 @@ public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO>
 
         initResultTable();
 
-        startAt = new StartAtTogglePanel(container);
+        startAt = new TaskStartAtTogglePanel(container);
         addInnerObject(startAt);
     }
 
@@ -202,7 +202,8 @@ public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO>
 
                             @Override
                             public void onClick(final AjaxRequestTarget target, final T ignore) {
-                                startAt.setTaskTO(target, model.getObject());
+                                startAt.setExecutionDetail(
+                                        model.getObject().getKey(), model.getObject().getName(), target);
                                 startAt.toggle(target, true);
                             }
                         }, ActionLink.ActionType.EXECUTE, StandardEntitlement.TASK_EXECUTE).

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
index 1f2e693..a85a248 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
@@ -115,8 +115,8 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
             }
         };
 
-        private final IModel<List<String>> reconciliationFilterBuilderClasses =
-                new LoadableDetachableModel<List<String>>() {
+        private final IModel<List<String>> reconciliationFilterBuilderClasses
+                = new LoadableDetachableModel<List<String>>() {
 
             private static final long serialVersionUID = 5275935387613157437L;
 
@@ -147,8 +147,8 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
         };
 
         public Profile(final SchedTaskTO taskTO) {
-            AjaxTextFieldPanel name =
-                    new AjaxTextFieldPanel("name", "name", new PropertyModel<String>(taskTO, "name"), false);
+            AjaxTextFieldPanel name = new AjaxTextFieldPanel("name", "name", new PropertyModel<String>(taskTO, "name"),
+                    false);
             name.addRequiredLabel();
             name.setEnabled(true);
             add(name);
@@ -158,8 +158,8 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
             description.setEnabled(true);
             add(description);
 
-            AjaxCheckBoxPanel active =
-                    new AjaxCheckBoxPanel("active", "active", new PropertyModel<Boolean>(taskTO, "active"), false);
+            AjaxCheckBoxPanel active = new AjaxCheckBoxPanel("active", "active", new PropertyModel<Boolean>(taskTO,
+                    "active"), false);
             add(active);
 
             AjaxDropDownChoicePanel<String> jobDelegateClassName = new AjaxDropDownChoicePanel<>(

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/StartAtTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/StartAtTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/StartAtTogglePanel.java
deleted file mode 100644
index 912fd5c..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/StartAtTogglePanel.java
+++ /dev/null
@@ -1,106 +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.tasks;
-
-import java.io.Serializable;
-import java.util.Date;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.TogglePanel;
-import org.apache.syncope.client.console.rest.TaskRestClient;
-import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.DateTimeFieldPanel;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.to.SchedTaskTO;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.model.Model;
-
-public class StartAtTogglePanel extends TogglePanel<Serializable> {
-
-    private static final long serialVersionUID = -3195479265440591519L;
-
-    private SchedTaskTO taskTO;
-
-    public StartAtTogglePanel(final WebMarkupContainer container) {
-        super("startAt");
-
-        final Form<?> form = new Form<>("startAtForm");
-        addInnerObject(form);
-
-        final Model<Date> startAtDateModel = new Model<>();
-
-        final DateTimeFieldPanel startAtDate = new DateTimeFieldPanel(
-                "startAtDate", "startAtDate", startAtDateModel, SyncopeConstants.DATE_PATTERNS[3]);
-
-        startAtDate.setReadOnly(true).hideLabel();
-        form.add(startAtDate);
-
-        final AjaxCheckBoxPanel startAtCheck = new AjaxCheckBoxPanel(
-                "startAtCheck", "startAtCheck", new Model<>(false), false);
-
-        form.add(startAtCheck);
-
-        startAtCheck.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306810L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                target.add(startAtDate.setModelObject(null).setReadOnly(!startAtCheck.getModelObject()));
-            }
-        });
-
-        form.add(new AjaxSubmitLink("startAt", form) {
-
-            private static final long serialVersionUID = -7978723352517770644L;
-
-            @Override
-            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-                try {
-                    new TaskRestClient().startExecution(taskTO.getKey(), startAtDateModel.getObject());
-                    info(getString(Constants.OPERATION_SUCCEEDED));
-                    toggle(target, false);
-                    target.add(container);
-                } catch (SyncopeClientException e) {
-                    error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
-                    LOG.error("While running propagation task {}", taskTO.getKey(), e);
-                }
-                SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
-            }
-
-            @Override
-            protected void onError(final AjaxRequestTarget target, final Form<?> form) {
-                SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
-            }
-
-        });
-    }
-
-    public void setTaskTO(final AjaxRequestTarget target, final SchedTaskTO taskTO) {
-        this.taskTO = taskTO;
-        setHeader(target, taskTO.getName());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
index 5484b8b..081d2dd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskDirectoryPanel.java
@@ -32,7 +32,6 @@ import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
-import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 
@@ -42,7 +41,7 @@ import org.apache.wicket.model.IModel;
  * @param <T> task type.
  */
 public abstract class TaskDirectoryPanel<T extends AbstractTaskTO>
-        extends DirectoryPanel<T, T, TaskDataProvider<T>, TaskRestClient> implements ModalPanel<T> {
+        extends DirectoryPanel<T, T, TaskDataProvider<T>, TaskRestClient> implements ModalPanel {
 
     private static final long serialVersionUID = 4984337552918213290L;
 
@@ -64,22 +63,7 @@ public abstract class TaskDirectoryPanel<T extends AbstractTaskTO>
         resultTableBuilder.setMultiLevelPanel(baseModal, multiLevelPanelRef);
     }
 
-    @Override
-    public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void onError(final AjaxRequestTarget target, final Form<?> form) {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public T getItem() {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    protected abstract void viewTask(T taskTO, AjaxRequestTarget target);
+    protected abstract void viewTask(final T taskTO, final AjaxRequestTarget target);
 
     protected abstract class TasksProvider<T extends AbstractTaskTO> extends DirectoryDataProvider<T> {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutionDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutionDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutionDetails.java
index e02e6c5..eb2254f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutionDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutionDetails.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.client.console.tasks;
 
 import org.apache.syncope.client.console.panels.MultilevelPanel;
+import org.apache.syncope.client.console.rest.TaskRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.wicket.PageReference;
@@ -39,7 +40,7 @@ public class TaskExecutionDetails<T extends AbstractTaskTO> extends MultilevelPa
         final MultilevelPanel mlp = new MultilevelPanel("executions");
         add(mlp);
 
-        mlp.setFirstLevel(new TaskExecutions(baseModal, mlp, taskTO, pageRef) {
+        mlp.setFirstLevel(new ExecutionsDirectoryPanel(baseModal, mlp, taskTO.getKey(), new TaskRestClient(), pageRef) {
 
             private static final long serialVersionUID = 5691719817252887541L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutions.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutions.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutions.java
deleted file mode 100644
index 84025e0..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskExecutions.java
+++ /dev/null
@@ -1,227 +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.tasks;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.DirectoryDataProvider;
-import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
-import org.apache.syncope.client.console.panels.DirectoryPanel;
-import org.apache.syncope.client.console.panels.AjaxDataTablePanel;
-import org.apache.syncope.client.console.panels.MultilevelPanel;
-import org.apache.syncope.client.console.panels.MultilevelPanel.SecondLevel;
-import org.apache.syncope.client.console.rest.TaskRestClient;
-import org.apache.syncope.client.console.tasks.TaskExecutions.TaskExecProvider;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
-import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.KeyPropertyColumn;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
-import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
-import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.AbstractTaskTO;
-import org.apache.syncope.common.lib.to.ExecTO;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
-import org.apache.wicket.model.AbstractReadOnlyModel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.model.StringResourceModel;
-
-public abstract class TaskExecutions
-        extends DirectoryPanel<ExecTO, ExecTO, TaskExecProvider, TaskRestClient> {
-
-    private static final long serialVersionUID = 2039393934721149162L;
-
-    private final BaseModal<?> baseModal;
-
-    private final MultilevelPanel multiLevelPanelRef;
-
-    protected TaskRestClient taskRestClient = new TaskRestClient();
-
-    private final AbstractTaskTO taskTO;
-
-    public TaskExecutions(
-            final BaseModal<?> baseModal,
-            final MultilevelPanel multiLevelPanelRef,
-            final AbstractTaskTO taskTO,
-            final PageReference pageRef) {
-        super(MultilevelPanel.FIRST_LEVEL_ID, pageRef, false);
-        this.baseModal = baseModal;
-        this.multiLevelPanelRef = multiLevelPanelRef;
-        restClient = taskRestClient;
-        setOutputMarkupId(true);
-        this.taskTO = taskTO;
-        initResultTable();
-    }
-
-    @Override
-    protected void resultTableCustomChanges(final AjaxDataTablePanel.Builder<ExecTO, String> resultTableBuilder) {
-        resultTableBuilder.setMultiLevelPanel(baseModal, multiLevelPanelRef);
-    }
-
-    protected abstract void next(final String title, final SecondLevel secondLevel, final AjaxRequestTarget target);
-
-    @Override
-    protected List<IColumn<ExecTO, String>> getColumns() {
-        final List<IColumn<ExecTO, String>> columns = new ArrayList<>();
-
-        columns.add(new KeyPropertyColumn<ExecTO>(new ResourceModel("key"), "key", "key"));
-
-        columns.add(new DatePropertyColumn<ExecTO>(new ResourceModel("start"), "start", "start"));
-
-        columns.add(new DatePropertyColumn<ExecTO>(new ResourceModel("end"), "end", "end"));
-
-        columns.add(new PropertyColumn<ExecTO, String>(new ResourceModel("status"), "status", "status"));
-
-        columns.add(new ActionColumn<ExecTO, String>(new ResourceModel("actions")) {
-
-            private static final long serialVersionUID = -3503023501954863131L;
-
-            @Override
-            public ActionLinksPanel<ExecTO> getActions(final String componentId, final IModel<ExecTO> model) {
-                final ExecTO taskExecutionTO = model.getObject();
-
-                final ActionLinksPanel.Builder<ExecTO> panel = ActionLinksPanel.builder();
-
-                panel.
-                        add(new ActionLink<ExecTO>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
-                                next(new StringResourceModel("execution.view", TaskExecutions.this, model).getObject(),
-                                        new ExecMessage(model.getObject().getMessage()), target);
-                            }
-                        }, ActionLink.ActionType.VIEW, StandardEntitlement.TASK_READ).
-                        add(new ActionLink<ExecTO>() {
-
-                            private static final long serialVersionUID = -3722207913631435501L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target, final ExecTO ignore) {
-                                try {
-                                    restClient.deleteExecution(taskExecutionTO.getKey());
-                                    taskTO.getExecutions().remove(taskExecutionTO);
-                                    info(getString(Constants.OPERATION_SUCCEEDED));
-                                } catch (SyncopeClientException scce) {
-                                    error(scce.getMessage());
-                                }
-                                target.add(TaskExecutions.this);
-                                SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
-                            }
-                        }, ActionLink.ActionType.DELETE, StandardEntitlement.TASK_DELETE);
-
-                return panel.build(componentId, model.getObject());
-            }
-
-            @Override
-            public ActionLinksPanel<Serializable> getHeader(final String componentId) {
-                final ActionLinksPanel.Builder<Serializable> panel = ActionLinksPanel.builder();
-
-                return panel.add(new ActionLink<Serializable>() {
-
-                    private static final long serialVersionUID = -7978723352517770644L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
-                        if (target != null) {
-                            target.add(container);
-                        }
-                    }
-                }, ActionLink.ActionType.RELOAD, StandardEntitlement.TASK_LIST).build(componentId);
-            }
-        });
-
-        return columns;
-    }
-
-    @Override
-    protected TaskExecProvider dataProvider() {
-        return new TaskExecProvider(taskTO.getKey(), rows);
-    }
-
-    @Override
-    protected String paginatorRowsKey() {
-        return Constants.PREF_TASK_EXECS_PAGINATOR_ROWS;
-    }
-
-    @Override
-    protected Collection<ActionLink.ActionType> getBulkActions() {
-        final List<ActionLink.ActionType> bulkActions = new ArrayList<>();
-        bulkActions.add(ActionLink.ActionType.DELETE);
-        return bulkActions;
-    }
-
-    protected class TaskExecProvider extends DirectoryDataProvider<ExecTO> {
-
-        private static final long serialVersionUID = 8943636537120648961L;
-
-        private final SortableDataProviderComparator<ExecTO> comparator;
-
-        private final String taskKey;
-
-        public TaskExecProvider(final String taskKey, final int paginatorRows) {
-            super(paginatorRows);
-            this.taskKey = taskKey;
-            comparator = new SortableDataProviderComparator<>(this);
-        }
-
-        public SortableDataProviderComparator<ExecTO> getComparator() {
-            return comparator;
-        }
-
-        @Override
-        public Iterator<ExecTO> iterator(final long first, final long count) {
-            final int page = ((int) first / paginatorRows);
-            List<ExecTO> list = taskRestClient.listExecutions(taskKey, (page < 0 ? 0 : page) + 1, paginatorRows);
-            Collections.sort(list, comparator);
-            return list.iterator();
-        }
-
-        @Override
-        public long size() {
-            return taskRestClient.countExecutions(taskKey);
-        }
-
-        @Override
-        public IModel<ExecTO> model(final ExecTO taskExecution) {
-
-            return new AbstractReadOnlyModel<ExecTO>() {
-
-                private static final long serialVersionUID = 7485475149862342421L;
-
-                @Override
-                public ExecTO getObject() {
-                    return taskExecution;
-                }
-            };
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskStartAtTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskStartAtTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskStartAtTogglePanel.java
new file mode 100644
index 0000000..5e250e2
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TaskStartAtTogglePanel.java
@@ -0,0 +1,39 @@
+/*
+ * 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.tasks;
+
+import org.apache.syncope.client.console.panels.StartAtTogglePanel;
+import org.apache.syncope.client.console.rest.ExecutionRestClient;
+import org.apache.syncope.client.console.rest.TaskRestClient;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+
+public class TaskStartAtTogglePanel extends StartAtTogglePanel {
+
+    private static final long serialVersionUID = -3195479265440591519L;
+
+    public TaskStartAtTogglePanel(final WebMarkupContainer container) {
+        super(container);
+    }
+
+    @Override
+    protected ExecutionRestClient getRestClient() {
+        return new TaskRestClient();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
index 0025f79..bc62538 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
@@ -44,6 +44,7 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.apache.syncope.client.console.panels.SubmitableModalPanel;
 
 public class BaseModal<T extends Serializable> extends Modal<T> {
 
@@ -123,21 +124,21 @@ public class BaseModal<T extends Serializable> extends Modal<T> {
         return form.getModelObject();
     }
 
-    public ModalPanel<T> getContent() {
+    public ModalPanel getContent() {
         if (content instanceof ModalPanel) {
-            return (ModalPanel<T>) content;
+            return (ModalPanel) content;
         }
         throw new IllegalStateException();
     }
 
-    public BaseModal<T> setContent(final ModalPanel<T> component) {
+    public BaseModal<T> setContent(final ModalPanel component) {
         if (component instanceof Panel) {
             return setInternalContent(Panel.class.cast(component));
         }
         throw new IllegalArgumentException("Panel instance is required");
     }
 
-    public BaseModal<T> setContent(final ModalPanel<T> component, final AjaxRequestTarget target) {
+    public BaseModal<T> setContent(final ModalPanel component, final AjaxRequestTarget target) {
         setContent(component);
         target.add(content);
         return this;
@@ -178,18 +179,22 @@ public class BaseModal<T extends Serializable> extends Modal<T> {
     }
 
     public AjaxSubmitLink addSubmitButton() {
+        if (!(BaseModal.this.getContent() instanceof SubmitableModalPanel)) {
+            throw new IllegalStateException();
+        }
+
         AjaxSubmitLink submit = new AjaxSubmitLink(SUBMIT, form) {
 
             private static final long serialVersionUID = -5783994974426198290L;
 
             @Override
             protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
-                BaseModal.this.getContent().onSubmit(target, form);
+                SubmitableModalPanel.class.cast(BaseModal.this.getContent()).onSubmit(target, form);
             }
 
             @Override
             protected void onError(final AjaxRequestTarget target, final Form<?> form) {
-                BaseModal.this.getContent().onError(target, form);
+                SubmitableModalPanel.class.cast(BaseModal.this.getContent()).onError(target, form);
             }
         };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ae52b12e/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
index 730bf9c..0d9c074 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
@@ -47,6 +47,7 @@ public abstract class ActionLink<T extends Serializable> implements Serializable
         CREATE("create"),
         EDIT("read"),
         TYPE_EXTENSIONS("read"),
+        FO_EDIT("read"),
         HTML_EDIT("read"),
         TEXT_EDIT("read"),
         LAYOUT_EDIT("read"),