You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2016/04/29 16:24:32 UTC

[1/5] syncope git commit: Useless import static

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


Useless import static


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

Branch: refs/heads/master
Commit: 7c591aa4df0078d4d6e6381b3c031e9d58140f53
Parents: ae52b12
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Apr 29 08:47:37 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Apr 29 08:47:37 2016 +0200

----------------------------------------------------------------------
 .../syncope/client/console/reports/ReportDirectoryPanel.java       | 2 --
 .../org/apache/syncope/client/console/rest/ReportRestClient.java   | 2 --
 2 files changed, 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/7c591aa4/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
index f2055b9..062c6eb 100644
--- 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
@@ -18,8 +18,6 @@
  */
 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;

http://git-wip-us.apache.org/repos/asf/syncope/blob/7c591aa4/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 1c59d09..dc72f04 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,8 +18,6 @@
  */
 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;


[4/5] syncope git commit: [SYNCOPE-745] Audit

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationHandler.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationHandler.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationHandler.java
deleted file mode 100644
index b089631..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationHandler.java
+++ /dev/null
@@ -1,131 +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 java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.client.console.panels.search.SearchClause;
-import org.apache.syncope.client.console.panels.search.SearchUtils;
-import org.apache.syncope.client.lib.SyncopeClient;
-import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
-import org.apache.syncope.common.lib.to.NotificationTO;
-
-public class NotificationHandler implements Serializable {
-
-    private static final long serialVersionUID = 8058288034211558376L;
-
-    private final NotificationTO notificationTO;
-
-    private List<Pair<String, List<SearchClause>>> aboutClauses;
-
-    private List<SearchClause> recipientClauses;
-
-    public NotificationHandler(final NotificationTO notificationTO) {
-        this.notificationTO = notificationTO;
-    }
-
-    public final String getKey() {
-        return this.notificationTO.getKey();
-    }
-
-    public List<Pair<String, List<SearchClause>>> getAboutClauses() {
-        if (this.aboutClauses == null) {
-            this.aboutClauses = new ArrayList<>();
-            for (Map.Entry<String, List<SearchClause>> entry
-                    : SearchUtils.getSearchClauses(this.notificationTO.getAbouts()).entrySet()) {
-                this.aboutClauses.add(Pair.of(entry.getKey(), (entry.getValue())));
-            }
-        }
-
-        return this.aboutClauses;
-    }
-
-    public void setAboutClauses(final List<Pair<String, List<SearchClause>>> dynClauses) {
-        this.aboutClauses = dynClauses;
-    }
-
-    public List<SearchClause> getRecipientClauses() {
-        if (this.recipientClauses == null) {
-            this.recipientClauses = SearchUtils.getSearchClauses(this.notificationTO.getRecipientsFIQL());
-        }
-        return this.recipientClauses;
-    }
-
-    public void setRecipientClauses(final List<SearchClause> dynClauses) {
-        this.recipientClauses = dynClauses;
-    }
-
-    public Map<String, String> getAboutFIQLs() {
-        if (CollectionUtils.isEmpty(this.aboutClauses)) {
-            return this.notificationTO.getAbouts();
-        } else {
-
-            final Map<String, String> res = new HashMap<>();
-            for (Pair<String, List<SearchClause>> pair : this.aboutClauses) {
-                AbstractFiqlSearchConditionBuilder builder;
-                switch (pair.getLeft()) {
-                    case "USER":
-                        builder = SyncopeClient.getUserSearchConditionBuilder();
-                        break;
-                    case "GROUP":
-                        builder = SyncopeClient.getGroupSearchConditionBuilder();
-                        break;
-                    default:
-                        builder = SyncopeClient.getAnyObjectSearchConditionBuilder(pair.getLeft());
-                        break;
-
-                }
-                res.put(pair.getLeft(), getFIQLString(pair.getRight(), builder));
-            }
-            return res;
-        }
-    }
-
-    private String getRecipientsFIQL() {
-        if (CollectionUtils.isEmpty(this.recipientClauses)) {
-            return null;
-        } else {
-            return getFIQLString(this.recipientClauses, SyncopeClient.getUserSearchConditionBuilder());
-        }
-    }
-
-    private String getFIQLString(final List<SearchClause> clauses, final AbstractFiqlSearchConditionBuilder bld) {
-        return SearchUtils.buildFIQL(clauses, bld);
-    }
-
-    public NotificationTO fillAboutConditions() {
-        this.notificationTO.getAbouts().clear();
-        this.notificationTO.getAbouts().putAll(this.getAboutFIQLs());
-        return this.notificationTO;
-    }
-
-    public NotificationTO fillRecipientConditions() {
-        this.notificationTO.setRecipientsFIQL(this.getRecipientsFIQL());
-        return this.notificationTO;
-    }
-
-    public NotificationTO getInnerObject() {
-        return this.notificationTO;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java
index fba971e..4bc8478 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.notifications;
 
+import org.apache.syncope.client.console.events.EventCategoryPanel;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -69,7 +70,7 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.ListModel;
 import org.apache.wicket.validation.validator.EmailAddressValidator;
 
-public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationHandler> {
+public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationWrapper> {
 
     private static final long serialVersionUID = -1975312550059578553L;
 
@@ -86,11 +87,11 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationHan
      * @param pageRef Caller page reference.
      */
     public NotificationWizardBuilder(final NotificationTO notificationTO, final PageReference pageRef) {
-        super(new NotificationHandler(notificationTO), pageRef);
+        super(new NotificationWrapper(notificationTO), pageRef);
     }
 
     @Override
-    protected Serializable onApplyInternal(final NotificationHandler modelObject) {
+    protected Serializable onApplyInternal(final NotificationWrapper modelObject) {
         modelObject.fillRecipientConditions();
         modelObject.fillAboutConditions();
 
@@ -105,7 +106,7 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationHan
     }
 
     @Override
-    protected WizardModel buildModelSteps(final NotificationHandler modelObject, final WizardModel wizardModel) {
+    protected WizardModel buildModelSteps(final NotificationWrapper modelObject, final WizardModel wizardModel) {
         wizardModel.add(new NotificationWizardBuilder.Details(modelObject));
         wizardModel.add(new NotificationWizardBuilder.Events(modelObject));
         wizardModel.add(new NotificationWizardBuilder.Abouts(modelObject));
@@ -117,7 +118,7 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationHan
 
         private static final long serialVersionUID = -7709805590497687958L;
 
-        public Details(final NotificationHandler modelObject) {
+        public Details(final NotificationWrapper modelObject) {
             final NotificationTO notificationTO = modelObject.getInnerObject();
             final boolean createFlag = notificationTO.getKey() == null;
 
@@ -165,7 +166,7 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationHan
                     "template", getString("template"),
                     new PropertyModel<String>(notificationTO, "template"));
             template.setChoices(CollectionUtils.collect(
-                    restClient.getAllAvailableTemplates(), new Transformer<MailTemplateTO, String>() {
+                    restClient.listTemplates(), new Transformer<MailTemplateTO, String>() {
 
                 @Override
                 public String transform(final MailTemplateTO input) {
@@ -197,25 +198,22 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationHan
 
         private static final long serialVersionUID = -7709805590497687958L;
 
-        public Events(final NotificationHandler modelObject) {
-            final NotificationTO notificationTO = modelObject.getInnerObject();
-            add(new LoggerCategoryPanel(
+        public Events(final NotificationWrapper modelObject) {
+            add(new EventCategoryPanel(
                     "eventSelection",
                     loggerRestClient.listEvents(),
-                    new PropertyModel<List<String>>(notificationTO, "events"),
-                    pageRef,
-                    "Notification") {
+                    new PropertyModel<List<String>>(modelObject.getInnerObject(), "events")) {
 
                 private static final long serialVersionUID = 6429053774964787735L;
 
                 @Override
-                protected String[] getListRoles() {
-                    return new String[] {};
+                protected List<String> getListAuthRoles() {
+                    return Collections.emptyList();
                 }
 
                 @Override
-                protected String[] getChangeRoles() {
-                    return new String[] {};
+                protected List<String> getChangeAuthRoles() {
+                    return Collections.emptyList();
                 }
             });
         }
@@ -313,7 +311,7 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationHan
 
         private static final long serialVersionUID = -7709805590497687958L;
 
-        public Abouts(final NotificationHandler modelObject) {
+        public Abouts(final NotificationWrapper modelObject) {
             final WebMarkupContainer aboutContainer = new WebMarkupContainer("about");
             aboutContainer.setOutputMarkupId(true);
             add(aboutContainer);
@@ -361,7 +359,7 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationHan
 
         private static final long serialVersionUID = -7709805590497687958L;
 
-        public Recipients(final NotificationHandler modelObject) {
+        public Recipients(final NotificationWrapper modelObject) {
             final NotificationTO notificationTO = modelObject.getInnerObject();
             final boolean createFlag = notificationTO.getKey() == null;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
new file mode 100644
index 0000000..031ebb8
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
@@ -0,0 +1,131 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.SearchUtils;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
+import org.apache.syncope.common.lib.to.NotificationTO;
+
+public class NotificationWrapper implements Serializable {
+
+    private static final long serialVersionUID = 8058288034211558376L;
+
+    private final NotificationTO notificationTO;
+
+    private List<Pair<String, List<SearchClause>>> aboutClauses;
+
+    private List<SearchClause> recipientClauses;
+
+    public NotificationWrapper(final NotificationTO notificationTO) {
+        this.notificationTO = notificationTO;
+    }
+
+    public final String getKey() {
+        return this.notificationTO.getKey();
+    }
+
+    public List<Pair<String, List<SearchClause>>> getAboutClauses() {
+        if (this.aboutClauses == null) {
+            this.aboutClauses = new ArrayList<>();
+            for (Map.Entry<String, List<SearchClause>> entry
+                    : SearchUtils.getSearchClauses(this.notificationTO.getAbouts()).entrySet()) {
+                this.aboutClauses.add(Pair.of(entry.getKey(), (entry.getValue())));
+            }
+        }
+
+        return this.aboutClauses;
+    }
+
+    public void setAboutClauses(final List<Pair<String, List<SearchClause>>> dynClauses) {
+        this.aboutClauses = dynClauses;
+    }
+
+    public List<SearchClause> getRecipientClauses() {
+        if (this.recipientClauses == null) {
+            this.recipientClauses = SearchUtils.getSearchClauses(this.notificationTO.getRecipientsFIQL());
+        }
+        return this.recipientClauses;
+    }
+
+    public void setRecipientClauses(final List<SearchClause> dynClauses) {
+        this.recipientClauses = dynClauses;
+    }
+
+    public Map<String, String> getAboutFIQLs() {
+        if (CollectionUtils.isEmpty(this.aboutClauses)) {
+            return this.notificationTO.getAbouts();
+        } else {
+
+            final Map<String, String> res = new HashMap<>();
+            for (Pair<String, List<SearchClause>> pair : this.aboutClauses) {
+                AbstractFiqlSearchConditionBuilder builder;
+                switch (pair.getLeft()) {
+                    case "USER":
+                        builder = SyncopeClient.getUserSearchConditionBuilder();
+                        break;
+                    case "GROUP":
+                        builder = SyncopeClient.getGroupSearchConditionBuilder();
+                        break;
+                    default:
+                        builder = SyncopeClient.getAnyObjectSearchConditionBuilder(pair.getLeft());
+                        break;
+
+                }
+                res.put(pair.getLeft(), getFIQLString(pair.getRight(), builder));
+            }
+            return res;
+        }
+    }
+
+    private String getRecipientsFIQL() {
+        if (CollectionUtils.isEmpty(this.recipientClauses)) {
+            return null;
+        } else {
+            return getFIQLString(this.recipientClauses, SyncopeClient.getUserSearchConditionBuilder());
+        }
+    }
+
+    private String getFIQLString(final List<SearchClause> clauses, final AbstractFiqlSearchConditionBuilder bld) {
+        return SearchUtils.buildFIQL(clauses, bld);
+    }
+
+    public NotificationTO fillAboutConditions() {
+        this.notificationTO.getAbouts().clear();
+        this.notificationTO.getAbouts().putAll(this.getAboutFIQLs());
+        return this.notificationTO;
+    }
+
+    public NotificationTO fillRecipientConditions() {
+        this.notificationTO.setRecipientsFIQL(this.getRecipientsFIQL());
+        return this.notificationTO;
+    }
+
+    public NotificationTO getInnerObject() {
+        return this.notificationTO;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/notifications/SelectedEventsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/SelectedEventsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/SelectedEventsPanel.java
deleted file mode 100644
index cf396f6..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/SelectedEventsPanel.java
+++ /dev/null
@@ -1,172 +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.util.List;
-import java.util.Set;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.event.Broadcast;
-import org.apache.wicket.event.IEvent;
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.IChoiceRenderer;
-import org.apache.wicket.markup.html.form.ListMultipleChoice;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.util.ListModel;
-
-public class SelectedEventsPanel extends Panel {
-
-    private static final long serialVersionUID = -4832450230348213500L;
-
-    private final WebMarkupContainer selectionContainer;
-
-    private ListMultipleChoice<String> selectedEvents;
-
-    private final IModel<List<String>> model;
-
-    public SelectedEventsPanel(final String id, final IModel<List<String>> model) {
-        super(id);
-
-        this.model = model;
-
-        selectionContainer = new WebMarkupContainer("selectionContainer");
-        selectionContainer.setOutputMarkupId(true);
-        add(selectionContainer);
-
-        selectedEvents = new ListMultipleChoice<String>("selectedEvents", new ListModel<String>(), model) {
-
-            private static final long serialVersionUID = 1226677544225737338L;
-
-            @Override
-            protected void onComponentTag(final ComponentTag tag) {
-                super.onComponentTag(tag);
-                tag.remove("size");
-                tag.remove("multiple");
-                tag.put("size", 5);
-            }
-        };
-
-        selectedEvents.setMaxRows(5);
-        selectedEvents.setChoiceRenderer(new IChoiceRenderer<String>() {
-
-            private static final long serialVersionUID = -4288397951948436434L;
-
-            @Override
-            public Object getDisplayValue(final String object) {
-                return object;
-            }
-
-            @Override
-            public String getIdValue(final String object, final int index) {
-                return object;
-            }
-
-            @Override
-            public String getObject(final String id, final IModel<? extends List<? extends String>> choices) {
-                return id;
-            }
-        });
-
-        selectedEvents.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -151291731388673682L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                send(SelectedEventsPanel.this.getPage(),
-                        Broadcast.BREADTH,
-                        new InspectSelectedEvent(target, selectedEvents.getModelValue()));
-            }
-        });
-
-        selectionContainer.add(selectedEvents);
-    }
-
-    @Override
-    public void onEvent(final IEvent<?> event) {
-        if (event.getPayload() instanceof EventSelectionChanged) {
-            final EventSelectionChanged eventSelectionChanged = (EventSelectionChanged) event.getPayload();
-
-            for (String toBeRemoved : eventSelectionChanged.getToBeRemoved()) {
-                model.getObject().remove(toBeRemoved);
-            }
-
-            for (String toBeAdded : eventSelectionChanged.getToBeAdded()) {
-                if (!model.getObject().contains(toBeAdded)) {
-                    model.getObject().add(toBeAdded);
-                }
-            }
-
-            eventSelectionChanged.getTarget().add(selectionContainer);
-        }
-    }
-
-    public static class InspectSelectedEvent {
-
-        private final AjaxRequestTarget target;
-
-        private final String event;
-
-        public InspectSelectedEvent(final AjaxRequestTarget target, final String event) {
-            this.target = target;
-            this.event = event;
-        }
-
-        public AjaxRequestTarget getTarget() {
-            return target;
-        }
-
-        public String getEvent() {
-            return event;
-        }
-    }
-
-    public static class EventSelectionChanged {
-
-        private final AjaxRequestTarget target;
-
-        private final Set<String> toBeRemoved;
-
-        private final Set<String> toBeAdded;
-
-        public EventSelectionChanged(
-                final AjaxRequestTarget target,
-                final Set<String> toBeAdded,
-                final Set<String> toBeRemoved) {
-            this.target = target;
-            this.toBeAdded = toBeAdded;
-            this.toBeRemoved = toBeRemoved;
-        }
-
-        public AjaxRequestTarget getTarget() {
-            return target;
-        }
-
-        public Set<String> getToBeRemoved() {
-            return toBeRemoved;
-        }
-
-        public Set<String> getToBeAdded() {
-            return toBeAdded;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/pages/Audit.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Audit.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Audit.java
new file mode 100644
index 0000000..9a5fc4a
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Audit.java
@@ -0,0 +1,127 @@
+/*
+ * 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.pages;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
+import org.apache.syncope.client.console.events.EventCategoryPanel;
+import org.apache.syncope.client.console.events.SelectedEventsPanel;
+import org.apache.syncope.client.console.rest.LoggerRestClient;
+import org.apache.syncope.common.lib.to.EventCategoryTO;
+import org.apache.syncope.common.lib.types.AuditElements;
+import org.apache.syncope.common.lib.types.AuditLoggerName;
+import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.util.ListModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class Audit extends BasePage {
+
+    private static final long serialVersionUID = -1100228004207271271L;
+
+    public Audit(final PageParameters parameters) {
+        super(parameters);
+
+        body.add(BookmarkablePageLinkBuilder.build("dashboard", "dashboardBr", Dashboard.class));
+
+        final LoggerRestClient loggerRestClient = new LoggerRestClient();
+
+        List<String> events = new ArrayList<>();
+        for (AuditLoggerName audit : loggerRestClient.listAudits()) {
+            events.add(AuditLoggerName.buildEvent(
+                    audit.getType(),
+                    audit.getCategory(),
+                    audit.getSubcategory(),
+                    audit.getEvent(),
+                    audit.getResult()));
+        }
+
+        WebMarkupContainer content = new WebMarkupContainer("content");
+        content.setOutputMarkupId(true);
+
+        Form<?> form = new Form<>("auditForm");
+        content.add(form);
+
+        form.add(new EventCategoryPanel(
+                "auditPanel",
+                loggerRestClient.listEvents(),
+                new ListModel<>(events)) {
+
+            private static final long serialVersionUID = 6113164334533550277L;
+
+            @Override
+            protected List<String> getListAuthRoles() {
+                return Collections.singletonList(StandardEntitlement.AUDIT_LIST);
+            }
+
+            @Override
+            protected List<String> getChangeAuthRoles() {
+                return Arrays.asList(
+                        new String[] { StandardEntitlement.AUDIT_ENABLE, StandardEntitlement.AUDIT_DISABLE });
+            }
+
+            @Override
+            public void onEventAction(final IEvent<?> event) {
+                if (event.getPayload() instanceof SelectedEventsPanel.EventSelectionChanged) {
+                    final SelectedEventsPanel.EventSelectionChanged eventSelectionChanged =
+                            (SelectedEventsPanel.EventSelectionChanged) event.getPayload();
+
+                    for (String toBeRemoved : eventSelectionChanged.getToBeRemoved()) {
+                        Pair<EventCategoryTO, AuditElements.Result> eventCategory =
+                                AuditLoggerName.parseEventCategory(toBeRemoved);
+
+                        AuditLoggerName auditLoggerName = new AuditLoggerName(
+                                eventCategory.getKey().getType(),
+                                eventCategory.getKey().getCategory(),
+                                eventCategory.getKey().getSubcategory(),
+                                CollectionUtils.isEmpty(eventCategory.getKey().getEvents())
+                                ? null : eventCategory.getKey().getEvents().iterator().next(),
+                                eventCategory.getValue());
+
+                        loggerRestClient.disableAudit(auditLoggerName);
+                    }
+
+                    for (String toBeAdded : eventSelectionChanged.getToBeAdded()) {
+                        Pair<EventCategoryTO, AuditElements.Result> eventCategory =
+                                AuditLoggerName.parseEventCategory(toBeAdded);
+
+                        AuditLoggerName auditLoggerName = new AuditLoggerName(
+                                eventCategory.getKey().getType(),
+                                eventCategory.getKey().getCategory(),
+                                eventCategory.getKey().getSubcategory(),
+                                CollectionUtils.isEmpty(eventCategory.getKey().getEvents())
+                                ? null : eventCategory.getKey().getEvents().iterator().next(),
+                                eventCategory.getValue());
+
+                        loggerRestClient.enableAudit(auditLoggerName);
+                    }
+                }
+            }
+        });
+
+        body.add(content);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index b0425a9..c5797db 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -160,6 +160,12 @@ public class BasePage extends WebPage implements IAjaxIndicatorAware {
         MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.ENABLE, StandardEntitlement.WORKFLOW_DEF_READ);
         liContainer.add(link);
 
+        liContainer = new WebMarkupContainer(getLIContainerId("audit"));
+        confULContainer.add(liContainer);
+        link = BookmarkablePageLinkBuilder.build("audit", Audit.class);
+        MetaDataRoleAuthorizationStrategy.authorize(link, WebPage.ENABLE, StandardEntitlement.AUDIT_LIST);
+        liContainer.add(link);
+
         liContainer = new WebMarkupContainer(getLIContainerId("logs"));
         confULContainer.add(liContainer);
         link = BookmarkablePageLinkBuilder.build("logs", Logs.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
index 3758258..0f4295c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Roles.java
@@ -21,7 +21,7 @@ package org.apache.syncope.client.console.pages;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.panels.RoleDirectoryPanel;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
-import org.apache.syncope.client.console.wizards.role.RoleHandler;
+import org.apache.syncope.client.console.wizards.role.RoleWrapper;
 import org.apache.syncope.client.console.wizards.role.RoleWizardBuilder;
 import org.apache.syncope.common.lib.to.RoleTO;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -40,7 +40,7 @@ public class Roles extends BasePage {
         content.setOutputMarkupId(true);
         body.add(content);
 
-        WizardMgtPanel<RoleHandler> rolesPanel = new RoleDirectoryPanel.Builder(getPageReference()) {
+        WizardMgtPanel<RoleWrapper> rolesPanel = new RoleDirectoryPanel.Builder(getPageReference()) {
 
             private static final long serialVersionUID = -5960765294082359003L;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDisplayAttributesModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDisplayAttributesModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDisplayAttributesModalPanel.java
index 9b02666..b99a323 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDisplayAttributesModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDisplayAttributesModalPanel.java
@@ -29,7 +29,7 @@ import org.apache.wicket.PageReference;
  * Modal window with Display any attributes form.
  *
  * @param <T> can be {@link org.apache.syncope.common.lib.to.AnyTO} or
- * {@link org.apache.syncope.client.console.wizards.any.AnyHandler}
+ * {@link org.apache.syncope.client.console.wizards.any.AnyWrapper}
  */
 public class AnyObjectDisplayAttributesModalPanel<T extends Serializable> extends DisplayAttributesModalPanel<T> {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java
index f09b59a..764a5e3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DisplayAttributesModalPanel.java
@@ -41,7 +41,7 @@ import org.apache.wicket.model.util.ListModel;
 /**
  * Modal window with Display attributes form.
  *
- * @param <T> can be {@link AnyTO} or {@link org.apache.syncope.client.console.wizards.any.AnyHandler}
+ * @param <T> can be {@link AnyTO} or {@link org.apache.syncope.client.console.wizards.any.AnyWrapper}
  */
 public abstract class DisplayAttributesModalPanel<T extends Serializable> extends AbstractModalPanel<T> {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java
index 30aeb96..43b8b93 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupDisplayAttributesModalPanel.java
@@ -29,7 +29,7 @@ import org.apache.wicket.PageReference;
  * Modal window with Display group attributes form.
  *
  * @param <T> can be {@link org.apache.syncope.common.lib.to.AnyTO} or
- * {@link org.apache.syncope.client.console.wizards.any.AnyHandler}
+ * {@link org.apache.syncope.client.console.wizards.any.AnyWrapper}
  */
 public class GroupDisplayAttributesModalPanel<T extends Serializable> extends DisplayAttributesModalPanel<T> {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
index ffccc48..9997e02 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
@@ -37,7 +37,7 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.Acti
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
-import org.apache.syncope.client.console.wizards.role.RoleHandler;
+import org.apache.syncope.client.console.wizards.role.RoleWrapper;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.RoleTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -50,7 +50,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColu
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
 
-public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleHandler, RoleDataProvider, RoleRestClient> {
+public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleWrapper, RoleDataProvider, RoleRestClient> {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
@@ -108,7 +108,7 @@ public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleHandler, Role
                     public void onClick(final AjaxRequestTarget target, final RoleTO ignore) {
                         send(RoleDirectoryPanel.this, Broadcast.EXACT,
                                 new AjaxWizard.EditItemActionEvent<>(
-                                        new RoleHandler(new RoleRestClient().read(model.getObject().getKey())),
+                                        new RoleWrapper(new RoleRestClient().read(model.getObject().getKey())),
                                         target));
                     }
                 }, ActionLink.ActionType.EDIT, StandardEntitlement.ROLE_READ).add(new ActionLink<RoleTO>() {
@@ -120,7 +120,7 @@ public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleHandler, Role
                         final RoleTO clone = SerializationUtils.clone(model.getObject());
                         clone.setKey(null);
                         send(RoleDirectoryPanel.this, Broadcast.EXACT,
-                                new AjaxWizard.NewItemActionEvent<>(new RoleHandler(clone), target));
+                                new AjaxWizard.NewItemActionEvent<>(new RoleWrapper(clone), target));
                     }
                 }, ActionLink.ActionType.CLONE, StandardEntitlement.ROLE_CREATE).add(new ActionLink<RoleTO>() {
 
@@ -187,7 +187,7 @@ public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleHandler, Role
     }
 
     public abstract static class Builder
-            extends DirectoryPanel.Builder<RoleTO, RoleHandler, RoleRestClient> {
+            extends DirectoryPanel.Builder<RoleTO, RoleWrapper, RoleRestClient> {
 
         private static final long serialVersionUID = 5088962796986706805L;
 
@@ -196,7 +196,7 @@ public class RoleDirectoryPanel extends DirectoryPanel<RoleTO, RoleHandler, Role
         }
 
         @Override
-        protected WizardMgtPanel<RoleHandler> newInstance(final String id) {
+        protected WizardMgtPanel<RoleWrapper> newInstance(final String id) {
             return new RoleDirectoryPanel(id, this);
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 9c2094f..21a85b6 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
@@ -264,9 +264,8 @@ public class SchemaTypePanel extends TypesDirectoryPanel<AbstractSchemaTO, Schem
 
         private SchemaProvider(final int paginatorRows, final SchemaType schemaType) {
             super(paginatorRows);
-            this.schemaType = schemaType;
 
-            // Default sorting
+            this.schemaType = schemaType;
             setSort("key", SortOrder.ASCENDING);
             comparator = new SortableDataProviderComparator<>(this);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 17a8535..a010569 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
@@ -179,7 +179,6 @@ public class TypeExtensionDirectoryPanel
         public TypeExtensionDataProvider(final int paginatorRows) {
             super(paginatorRows);
 
-            //Default sorting
             setSort("anyKey", SortOrder.DESCENDING);
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
index ff833a8..1ef96ca 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserDisplayAttributesModalPanel.java
@@ -29,7 +29,7 @@ import org.apache.wicket.PageReference;
  * Modal window with Display user attributes form.
  *
  * @param <T> can be {@link org.apache.syncope.common.lib.to.AnyTO} or
- * {@link org.apache.syncope.client.console.wizards.any.AnyHandler}
+ * {@link org.apache.syncope.client.console.wizards.any.AnyWrapper}
  */
 public class UserDisplayAttributesModalPanel<T extends Serializable> extends DisplayAttributesModalPanel<T> {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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
index 062c6eb..1f56083 100644
--- 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
@@ -228,27 +228,23 @@ public abstract class ReportDirectoryPanel
 
         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();
+            List<ReportTO> list = restClient.list();
+            Collections.sort(list, comparator);
+            return list.subList((int) first, (int) first + (int) count).iterator();
         }
 
         @Override
         public long size() {
-            return reports.size();
+            return restClient.list().size();
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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
index 497a4bd..31e84f1 100644
--- 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
@@ -225,14 +225,14 @@ public class ReportTemplateDirectoryPanel
 
         @Override
         public Iterator<ReportTemplateTO> iterator(final long first, final long count) {
-            final List<ReportTemplateTO> list = restClient.getAllAvailableTemplates();
+            final List<ReportTemplateTO> list = restClient.listTemplates();
             Collections.sort(list, comparator);
             return list.subList((int) first, (int) first + (int) count).iterator();
         }
 
         @Override
         public long size() {
-            return restClient.getAllAvailableTemplates().size();
+            return restClient.listTemplates().size();
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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
index 6a12244..6d4922c 100644
--- 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
@@ -78,7 +78,7 @@ public class ReportWizardBuilder extends AjaxWizardBuilder<ReportTO> {
                     "template", getString("template"),
                     new PropertyModel<String>(reportTO, "template"));
             template.setChoices(CollectionUtils.collect(
-                    restClient.getAllAvailableTemplates(), new Transformer<ReportTemplateTO, String>() {
+                    restClient.listTemplates(), new Transformer<ReportTemplateTO, String>() {
 
                 @Override
                 public String transform(final ReportTemplateTO input) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 eab0a17..1509217 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
@@ -34,7 +34,7 @@ public class NotificationRestClient extends BaseRestClient
 
     private static final long serialVersionUID = 6328933265096511690L;
 
-    public List<NotificationTO> getAllNotifications() {
+    public List<NotificationTO> list() {
         return getService(NotificationService.class).list();
     }
 
@@ -55,7 +55,7 @@ public class NotificationRestClient extends BaseRestClient
     }
 
     @Override
-    public List<MailTemplateTO> getAllAvailableTemplates() {
+    public List<MailTemplateTO> listTemplates() {
         return getService(MailTemplateService.class).list();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 dc72f04..30e2037 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
@@ -97,7 +97,7 @@ public class ReportRestClient extends BaseRestClient
     }
 
     @Override
-    public List<ReportTemplateTO> getAllAvailableTemplates() {
+    public List<ReportTemplateTO> listTemplates() {
         return getService(ReportTemplateService.class).list();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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
index 9bb62b6..d3d5c35 100644
--- 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
@@ -22,7 +22,7 @@ import java.util.List;
 
 public interface TemplateRestClient<T, F> extends RestClient {
 
-    List<T> getAllAvailableTemplates();
+    List<T> listTemplates();
 
     void createTemplate(final T templateTO);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 14fc503..3dd4955 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
@@ -31,6 +31,7 @@ import org.apache.syncope.client.console.commons.TaskDataProvider;
 import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
 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.bootstrap.dialog.BaseModal;
@@ -140,7 +141,7 @@ public abstract class SchedTaskDirectoryPanel<T extends SchedTaskTO>
         columns.add(new PropertyColumn<T, String>(
                 new StringResourceModel("latestExecStatus", this, null), "latestExecStatus", "latestExecStatus"));
 
-        columns.add(new PropertyColumn<T, String>(
+        columns.add(new BooleanPropertyColumn<T>(
                 new StringResourceModel("active", this, null), "active", "active"));
 
         return columns;

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 081d2dd..db58085 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
@@ -76,7 +76,6 @@ public abstract class TaskDirectoryPanel<T extends AbstractTaskTO>
         public TasksProvider(final int paginatorRows, final TaskType id) {
             super(paginatorRows);
 
-            //Default sorting
             setSort("key", SortOrder.DESCENDING);
             comparator = new SortableDataProviderComparator<>(this);
             this.id = id;

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java
index edf9b80..5a6abe9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java
@@ -50,7 +50,7 @@ public class DynamicMemberships extends WizardStep {
 
     private final AnyTypeRestClient anyTypeRestClient = new AnyTypeRestClient();
 
-    public DynamicMemberships(final GroupWrapper groupHandler) {
+    public DynamicMemberships(final GroupWrapper groupWrapper) {
         super();
 
         final LoadableDetachableModel<List<AnyTypeTO>> types = new LoadableDetachableModel<List<AnyTypeTO>>() {
@@ -79,10 +79,10 @@ public class DynamicMemberships extends WizardStep {
 
             @Override
             public Panel getPanel(final String panelId) {
-                return new UserSearchPanel.Builder(new PropertyModel<List<SearchClause>>(groupHandler, "uDynClauses")).
+                return new UserSearchPanel.Builder(new PropertyModel<List<SearchClause>>(groupWrapper, "uDynClauses")).
                         required(false).build(panelId);
             }
-        }), Model.of(StringUtils.isBlank(groupHandler.getUDynMembershipCond()) ? -1 : 0)).setOutputMarkupId(true));
+        }), Model.of(StringUtils.isBlank(groupWrapper.getUDynMembershipCond()) ? -1 : 0)).setOutputMarkupId(true));
         // ------------------------ 
 
         // ------------------------
@@ -104,10 +104,10 @@ public class DynamicMemberships extends WizardStep {
                     @Override
                     public Panel getPanel(final String panelId) {
                         return new AnyObjectSearchPanel.Builder(
-                                key, new MapOfListModel<SearchClause>(groupHandler, "aDynClauses", key)).
+                                key, new MapOfListModel<SearchClause>(groupWrapper, "aDynClauses", key)).
                                 required(false).build(panelId);
                     }
-                }), Model.of(StringUtils.isBlank(groupHandler.getADynMembershipConds().get(key)) ? -1 : 0))
+                }), Model.of(StringUtils.isBlank(groupWrapper.getADynMembershipConds().get(key)) ? -1 : 0))
                         .setOutputMarkupId(true));
             }
         });

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java
index f60f3c4..aac95f8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Ownership.java
@@ -91,11 +91,11 @@ public class Ownership extends WizardStep {
 
     private final Model<Boolean> isGroupOwnership;
 
-    public Ownership(final GroupWrapper groupHandler, final PageReference pageRef) {
+    public Ownership(final GroupWrapper groupWrapper, final PageReference pageRef) {
         super();
-        this.wrapper = groupHandler;
+        this.wrapper = groupWrapper;
 
-        isGroupOwnership = Model.of(groupHandler.getInnerObject().getGroupOwner() != null);
+        isGroupOwnership = Model.of(groupWrapper.getInnerObject().getGroupOwner() != null);
 
         final BootstrapToggleConfig config = new BootstrapToggleConfig().
                 withOnStyle(BootstrapToggleConfig.Style.info).
@@ -187,16 +187,16 @@ public class Ownership extends WizardStep {
         }
 
         final AjaxTextFieldPanel userOwner = new AjaxTextFieldPanel(
-                "userOwner", "userOwner", new PropertyModel<String>(groupHandler.getInnerObject(), "userOwner") {
+                "userOwner", "userOwner", new PropertyModel<String>(groupWrapper.getInnerObject(), "userOwner") {
 
             private static final long serialVersionUID = -3743432456095828573L;
 
             @Override
             public String getObject() {
-                if (groupHandler.getInnerObject().getUserOwner() == null) {
+                if (groupWrapper.getInnerObject().getUserOwner() == null) {
                     return StringUtils.EMPTY;
                 } else {
-                    UserTO userTO = userRestClient.read(groupHandler.getInnerObject().getUserOwner());
+                    UserTO userTO = userRestClient.read(groupWrapper.getInnerObject().getUserOwner());
                     if (userTO == null) {
                         return StringUtils.EMPTY;
                     } else {
@@ -208,11 +208,11 @@ public class Ownership extends WizardStep {
             @Override
             public void setObject(final String object) {
                 if (StringUtils.isBlank(object)) {
-                    groupHandler.getInnerObject().setUserOwner(null);
+                    groupWrapper.getInnerObject().setUserOwner(null);
                 } else {
                     final Matcher matcher = owner.matcher(object);
                     if (matcher.matches()) {
-                        groupHandler.getInnerObject().setUserOwner(matcher.group(1));
+                        groupWrapper.getInnerObject().setUserOwner(matcher.group(1));
                     }
                 }
             }
@@ -235,16 +235,16 @@ public class Ownership extends WizardStep {
         userSearchFragment.add(userOwnerReset);
 
         final AjaxTextFieldPanel groupOwner = new AjaxTextFieldPanel(
-                "groupOwner", "groupOwner", new PropertyModel<String>(groupHandler.getInnerObject(), "groupOwner") {
+                "groupOwner", "groupOwner", new PropertyModel<String>(groupWrapper.getInnerObject(), "groupOwner") {
 
             private static final long serialVersionUID = -3743432456095828573L;
 
             @Override
             public String getObject() {
-                if (groupHandler.getInnerObject().getGroupOwner() == null) {
+                if (groupWrapper.getInnerObject().getGroupOwner() == null) {
                     return StringUtils.EMPTY;
                 } else {
-                    GroupTO groupTO = groupRestClient.read(groupHandler.getInnerObject().getGroupOwner());
+                    GroupTO groupTO = groupRestClient.read(groupWrapper.getInnerObject().getGroupOwner());
                     if (groupTO == null) {
                         return StringUtils.EMPTY;
                     } else {
@@ -256,11 +256,11 @@ public class Ownership extends WizardStep {
             @Override
             public void setObject(final String object) {
                 if (StringUtils.isBlank(object)) {
-                    groupHandler.getInnerObject().setGroupOwner(null);
+                    groupWrapper.getInnerObject().setGroupOwner(null);
                 } else {
                     final Matcher matcher = owner.matcher(object);
                     if (matcher.matches()) {
-                        groupHandler.getInnerObject().setGroupOwner(matcher.group(1));
+                        groupWrapper.getInnerObject().setGroupOwner(matcher.group(1));
                     }
                 }
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleHandler.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleHandler.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleHandler.java
deleted file mode 100644
index f7034b6..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleHandler.java
+++ /dev/null
@@ -1,74 +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.wizards.role;
-
-import java.io.Serializable;
-import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.syncope.client.console.panels.search.SearchClause;
-import org.apache.syncope.client.console.panels.search.SearchUtils;
-import org.apache.syncope.client.lib.SyncopeClient;
-import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
-import org.apache.syncope.common.lib.to.RoleTO;
-
-public class RoleHandler implements Serializable {
-
-    private static final long serialVersionUID = 8058288034211558376L;
-
-    private final RoleTO roleTO;
-
-    private List<SearchClause> dynClauses;
-
-    public RoleHandler(final RoleTO roleTO) {
-        this.roleTO = roleTO;
-        getDynClauses();
-    }
-
-    public final List<SearchClause> getDynClauses() {
-        if (this.dynClauses == null) {
-            this.dynClauses = SearchUtils.getSearchClauses(this.roleTO.getDynMembershipCond());
-        }
-        return this.dynClauses;
-    }
-
-    public void setDynClauses(final List<SearchClause> dynClauses) {
-        this.dynClauses = dynClauses;
-    }
-
-    public String getDynMembershipCond() {
-        if (CollectionUtils.isEmpty(this.dynClauses)) {
-            return null;
-        } else {
-            return getFIQLString(this.dynClauses, SyncopeClient.getUserSearchConditionBuilder());
-        }
-    }
-
-    private String getFIQLString(final List<SearchClause> clauses, final AbstractFiqlSearchConditionBuilder bld) {
-        return SearchUtils.buildFIQL(clauses, bld);
-    }
-
-    public RoleTO fillDynamicConditions() {
-        this.roleTO.setDynMembershipCond(this.getDynMembershipCond());
-        return this.roleTO;
-    }
-
-    public RoleTO getInnerObject() {
-        return this.roleTO;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
index 9c2bea1..c71d1ca 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
@@ -46,7 +46,7 @@ import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.ListModel;
 
-public class RoleWizardBuilder extends AjaxWizardBuilder<RoleHandler> {
+public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
 
     private static final long serialVersionUID = 5945391813567245081L;
 
@@ -59,7 +59,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleHandler> {
      * @param pageRef Caller page reference.
      */
     public RoleWizardBuilder(final RoleTO roleTO, final PageReference pageRef) {
-        super(new RoleHandler(roleTO), pageRef);
+        super(new RoleWrapper(roleTO), pageRef);
     }
 
     /**
@@ -70,14 +70,14 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleHandler> {
      * @return the current builder.
      */
     @Override
-    public AjaxWizardBuilder<RoleHandler> setItem(final RoleHandler item) {
-        return (AjaxWizardBuilder<RoleHandler>) (item == null
+    public AjaxWizardBuilder<RoleWrapper> setItem(final RoleWrapper item) {
+        return (AjaxWizardBuilder<RoleWrapper>) (item == null
                 ? super.setItem(item)
-                : super.setItem(new RoleHandler(item.getInnerObject())));
+                : super.setItem(new RoleWrapper(item.getInnerObject())));
     }
 
     @Override
-    protected Serializable onApplyInternal(final RoleHandler modelObject) {
+    protected Serializable onApplyInternal(final RoleWrapper modelObject) {
         modelObject.fillDynamicConditions();
         if (getOriginalItem() == null || getOriginalItem().getInnerObject() == null
                 || StringUtils.isBlank(getOriginalItem().getInnerObject().getKey())) {
@@ -89,7 +89,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleHandler> {
     }
 
     @Override
-    protected WizardModel buildModelSteps(final RoleHandler modelObject, final WizardModel wizardModel) {
+    protected WizardModel buildModelSteps(final RoleWrapper modelObject, final WizardModel wizardModel) {
         wizardModel.add(new Details(modelObject));
         wizardModel.add(new Entitlements(modelObject.getInnerObject()));
         wizardModel.add(new Realms(modelObject.getInnerObject()));
@@ -100,7 +100,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleHandler> {
 
         private static final long serialVersionUID = 5514523040031722255L;
 
-        public Details(final RoleHandler modelObject) {
+        public Details(final RoleWrapper modelObject) {
             add(new AjaxTextFieldPanel(
                     "key", "key", new PropertyModel<String>(modelObject.getInnerObject(), "key"), false));
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWrapper.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWrapper.java
new file mode 100644
index 0000000..462ffed
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWrapper.java
@@ -0,0 +1,74 @@
+/*
+ * 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.wizards.role;
+
+import java.io.Serializable;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.syncope.client.console.panels.search.SearchClause;
+import org.apache.syncope.client.console.panels.search.SearchUtils;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
+import org.apache.syncope.common.lib.to.RoleTO;
+
+public class RoleWrapper implements Serializable {
+
+    private static final long serialVersionUID = 8058288034211558376L;
+
+    private final RoleTO roleTO;
+
+    private List<SearchClause> dynClauses;
+
+    public RoleWrapper(final RoleTO roleTO) {
+        this.roleTO = roleTO;
+        getDynClauses();
+    }
+
+    public final List<SearchClause> getDynClauses() {
+        if (this.dynClauses == null) {
+            this.dynClauses = SearchUtils.getSearchClauses(this.roleTO.getDynMembershipCond());
+        }
+        return this.dynClauses;
+    }
+
+    public void setDynClauses(final List<SearchClause> dynClauses) {
+        this.dynClauses = dynClauses;
+    }
+
+    public String getDynMembershipCond() {
+        if (CollectionUtils.isEmpty(this.dynClauses)) {
+            return null;
+        } else {
+            return getFIQLString(this.dynClauses, SyncopeClient.getUserSearchConditionBuilder());
+        }
+    }
+
+    private String getFIQLString(final List<SearchClause> clauses, final AbstractFiqlSearchConditionBuilder bld) {
+        return SearchUtils.buildFIQL(clauses, bld);
+    }
+
+    public RoleTO fillDynamicConditions() {
+        this.roleTO.setDynMembershipCond(this.getDynMembershipCond());
+        return this.roleTO;
+    }
+
+    public RoleTO getInnerObject() {
+        return this.roleTO;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 12ed32e..c854b05 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
@@ -839,5 +839,50 @@ div#templates {
   clear: both;
 }
 /**
-END -CRONTAB
+END - CRONTAB
+*/
+
+/**
+START - EVENTS
+*/
+.events {
+  display: table-row;
+  width: 990px;
+}
+
+.selectedEvents {
+  display: inline-block;
+  height: 100px;
+  margin: 10px 10px 0 10px;
+  overflow-y: auto;
+}
+
+.eventSelection {
+  display: inline-table;
+  float: right;
+  width: 380px;
+  min-width: 530px;
+}
+
+.eventSelection div#value {
+  height: auto;
+  overflow: hidden;
+}
+
+.eventSelection div#value div#custom {
+  width: auto;
+  overflow: hidden;
+}
+
+.eventSelection div#value div#customActions {
+  width: 85px;
+  float: right;
+}
+
+div#selectionContainer select {
+  width: 585px;
+  min-width: 585px;
+}
+/**
+END - EVENTS
 */

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/console.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/console.properties b/client/console/src/main/resources/console.properties
index b4a0b7c..c7733fd 100644
--- a/client/console/src/main/resources/console.properties
+++ b/client/console/src/main/resources/console.properties
@@ -37,6 +37,7 @@ page.realms=org.apache.syncope.client.console.pages.Realms
 page.topology=org.apache.syncope.client.console.topology.Topology
 page.reports=org.apache.syncope.client.console.pages.Reports
 page.workflow=org.apache.syncope.client.console.pages.Workflow
+page.audit=org.apache.syncope.client.console.pages.Audit
 page.logs=org.apache.syncope.client.console.pages.Logs
 page.securityquestions=org.apache.syncope.client.console.pages.SecurityQuestions
 page.types=org.apache.syncope.client.console.pages.Types

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
index 6b583cc..dba9d59 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication.properties
@@ -71,3 +71,4 @@ OrderByLink.CSS.ascending=sorting_asc
 OrderByLink.CSS.descending=sorting_desc
 OrderByLink.CSS.none=sorting
 entitlements=Entitlements
+audit=Audit

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
index 0858a0d..597b625 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_it.properties
@@ -70,3 +70,4 @@ OrderByLink.CSS.ascending=sorting_asc
 OrderByLink.CSS.descending=sorting_desc
 OrderByLink.CSS.none=sorting
 entitlements=Entitlement
+audit=Audit

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
index 8dd50da..a43dfb6 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_pt_BR.properties
@@ -70,3 +70,4 @@ OrderByLink.CSS.ascending=sorting_asc
 OrderByLink.CSS.descending=sorting_desc
 OrderByLink.CSS.none=sorting
 entitlements=Entitlement
+audit=Audit

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
index 1bb9e32..799a716 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/SyncopeConsoleApplication_ru.properties
@@ -121,3 +121,4 @@ OrderByLink.CSS.descending=\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043
 OrderByLink.CSS.none=\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430
 # entitlements=\u00d0\u009f\u00d0\u00be\u00d0\u00bb\u00d0\u00bd\u00d0\u00be\u00d0\u00bc\u00d0\u00be\u00d1\u0087\u00d0\u00b8\u00d1\u008f
 entitlements=\u041f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f
+audit=Audit

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/events/EventCategoryPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/events/EventCategoryPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/events/EventCategoryPanel.html
new file mode 100644
index 0000000..2e3915f
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/events/EventCategoryPanel.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:panel>
+    <div class="events">
+      <div class="selectedEvents">
+        <span wicket:id="selectedEventsPanel">[selected events panel]</span>
+      </div>
+
+      <div class="eventSelection">
+        <div wicket:id="categoryContainer">
+          <div>
+            <span wicket:id="type">[type]</span>
+          </div>
+          <div>
+            <span wicket:id="category">[category]</span>
+          </div>
+          <div>
+            <span wicket:id="subcategory">[sub-category]</span>
+          </div>
+          <div>
+            <div id="eventLabel">
+              <eventLabel wicket:id="customLabel"/>
+            </div>
+            <div id="value">
+              <div id="customActions" wicket:id="customActions">[actions]</div>
+              <div id="custom" wicket:id="custom">[custom]</div>
+            </div>
+          </div>
+        </div>
+        <div wicket:id="eventsContainer">
+          <span wicket:id="eventsPanel">[events panel]</span>
+        </div>
+      </div>
+    </div>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/events/EventSelectionPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/events/EventSelectionPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/events/EventSelectionPanel.html
new file mode 100644
index 0000000..8baffa9
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/events/EventSelectionPanel.html
@@ -0,0 +1,125 @@
+<!--
+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>
+      .container {
+        display: block;
+        width: 100%;
+      }
+
+      .eventLabel {
+        font-size: 12px;
+        vertical-align: middle;
+        font-family: Verdana,Tahoma,sans-serif;
+        display: table-cell;
+        width: 300px;
+        height: 20px;
+      }
+
+      .divtableheadereventLabel {
+        font-weight: bold;
+        float: left;
+        margin-left: 5px;
+        display: table-cell;
+        width: 70px;
+      }
+
+      .divtableheadercell {
+        display: inline-table;
+        vertical-align: top;
+        text-align: right;
+        width: 105px;
+        height: 20px;
+      }
+
+      .divtablecheckcolumn {
+        display: table-cell;
+        vertical-align: top;
+        text-align: right;
+        width: 105px;
+      }
+
+      .divtablecheck {
+        width: 105px;
+        height: 20px;
+      }
+
+    </style>
+  </wicket:head>
+  <wicket:panel>
+    <div class="eventSelectionWidzard">
+      <div class="container">
+        <div style="display:inline-table;">
+          <div class="eventLabel">
+            &nbsp;
+          </div>
+          <div style="display: table-cell">
+            <div class="divtableheadercell">
+              <div class="divtableheadereventLabel">
+                <eventLabel wicket:id="successLabel"/>
+              </div>
+              <div style="display: table-cell">
+                <input type="checkbox" wicket:id="successSelector" style="margin-top: 0px;margin-bottom: 0px;"/>
+              </div>
+            </div>
+          </div>
+          <div style="display: table-cell">
+            <div class="divtableheadercell">
+              <div class="divtableheadereventLabel">
+                <eventLabel wicket:id="failureLabel"/>
+              </div>
+              <div style="display: table-cell">
+                <input type="checkbox" wicket:id="failureSelector" style="margin-top: 0px;margin-bottom: 0px;"/>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="container">
+        <div class="eventLabel">
+          <div id="divtablerow-eventLabel" wicket:id="categoryView">
+            <div class="eventLabel">
+              <span wicket:id="subcategory">[subcategory]</span>
+            </div>
+          </div>
+        </div>
+
+        <div id="divtablerow-success" class="divtablecheckcolumn">
+          <span wicket:id="successGroup">
+            <div wicket:id="successView" class="divtablecheck">
+              <div class="divtableheadereventLabel">&nbsp;</div>
+              <input type="checkbox" wicket:id="successCheck"/>
+            </div>
+          </span>
+        </div>
+
+        <div id="divtablerow-failure" class="divtablecheckcolumn">
+          <span wicket:id="failureGroup">
+            <div wicket:id="failureView" class="divtablecheck">
+              <div class="divtableheadereventLabel">&nbsp;</div>
+              <input type="checkbox" wicket:id="failureCheck"/>
+            </div>
+          </span>
+        </div>
+      </div>
+    </div>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/events/SelectedEventsPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/events/SelectedEventsPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/events/SelectedEventsPanel.html
new file mode 100644
index 0000000..3a9ff63
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/events/SelectedEventsPanel.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 id="selectionContainer" wicket:id="selectionContainer">
+      <select wicket:id="selectedEvents"></select>
+    </div>
+  </wicket:panel>
+</html>


[2/5] syncope git commit: [SYNCOPE-156] Minor cleanup

Posted by il...@apache.org.
[SYNCOPE-156] Minor cleanup


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

Branch: refs/heads/master
Commit: 3b16483cfeacbf0aebffc0560fba50918d0af737
Parents: 7c591aa
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Apr 29 11:37:28 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Apr 29 11:37:28 2016 +0200

----------------------------------------------------------------------
 .../apache/syncope/client/console/commons/PropertyList.java    | 6 ------
 .../console/panels/ParametersCreateWizardSchemaStep.java       | 2 +-
 .../syncope/client/console/panels/PlainSchemaDetails.java      | 4 ++--
 3 files changed, 3 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/3b16483c/client/console/src/main/java/org/apache/syncope/client/console/commons/PropertyList.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/PropertyList.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/PropertyList.java
index 46a61d7..a7a0933 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/PropertyList.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/PropertyList.java
@@ -28,12 +28,6 @@ import org.apache.syncope.common.lib.SyncopeConstants;
 
 public abstract class PropertyList<T> implements List<String> {
 
-    private final T objectTO;
-
-    public PropertyList(final T objectTO) {
-        this.objectTO = objectTO;
-    }
-
     @Override
     public boolean add(final String item) {
         final List<String> list = getEnumValuesAsList(getValues());

http://git-wip-us.apache.org/repos/asf/syncope/blob/3b16483c/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java
index fd8544f..70ff104 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ParametersCreateWizardSchemaStep.java
@@ -58,7 +58,7 @@ public class ParametersCreateWizardSchemaStep extends WizardStep {
 
             @Override
             public PropertyList<PlainSchemaTO> getObject() {
-                return new PropertyList<PlainSchemaTO>(modelObject.getPlainSchemaTO()) {
+                return new PropertyList<PlainSchemaTO>() {
 
                     @Override
                     public String getValues() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/3b16483c/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
index 0b15cfe..d67ae8f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/PlainSchemaDetails.java
@@ -101,7 +101,7 @@ public class PlainSchemaDetails extends AbstractSchemaDetailsPanel {
 
             @Override
             public PropertyList<PlainSchemaTO> getObject() {
-                return new PropertyList<PlainSchemaTO>(PlainSchemaTO.class.cast(schemaTO)) {
+                return new PropertyList<PlainSchemaTO>() {
 
                     @Override
                     public String getValues() {
@@ -140,7 +140,7 @@ public class PlainSchemaDetails extends AbstractSchemaDetailsPanel {
 
             @Override
             public PropertyList<PlainSchemaTO> getObject() {
-                return new PropertyList<PlainSchemaTO>(PlainSchemaTO.class.cast(schemaTO)) {
+                return new PropertyList<PlainSchemaTO>() {
 
                     @Override
                     public String getValues() {


[3/5] syncope git commit: [SYNCOPE-745] Audit

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/notifications/EventSelectionPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/EventSelectionPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/EventSelectionPanel.html
deleted file mode 100644
index 8baffa9..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/EventSelectionPanel.html
+++ /dev/null
@@ -1,125 +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>
-      .container {
-        display: block;
-        width: 100%;
-      }
-
-      .eventLabel {
-        font-size: 12px;
-        vertical-align: middle;
-        font-family: Verdana,Tahoma,sans-serif;
-        display: table-cell;
-        width: 300px;
-        height: 20px;
-      }
-
-      .divtableheadereventLabel {
-        font-weight: bold;
-        float: left;
-        margin-left: 5px;
-        display: table-cell;
-        width: 70px;
-      }
-
-      .divtableheadercell {
-        display: inline-table;
-        vertical-align: top;
-        text-align: right;
-        width: 105px;
-        height: 20px;
-      }
-
-      .divtablecheckcolumn {
-        display: table-cell;
-        vertical-align: top;
-        text-align: right;
-        width: 105px;
-      }
-
-      .divtablecheck {
-        width: 105px;
-        height: 20px;
-      }
-
-    </style>
-  </wicket:head>
-  <wicket:panel>
-    <div class="eventSelectionWidzard">
-      <div class="container">
-        <div style="display:inline-table;">
-          <div class="eventLabel">
-            &nbsp;
-          </div>
-          <div style="display: table-cell">
-            <div class="divtableheadercell">
-              <div class="divtableheadereventLabel">
-                <eventLabel wicket:id="successLabel"/>
-              </div>
-              <div style="display: table-cell">
-                <input type="checkbox" wicket:id="successSelector" style="margin-top: 0px;margin-bottom: 0px;"/>
-              </div>
-            </div>
-          </div>
-          <div style="display: table-cell">
-            <div class="divtableheadercell">
-              <div class="divtableheadereventLabel">
-                <eventLabel wicket:id="failureLabel"/>
-              </div>
-              <div style="display: table-cell">
-                <input type="checkbox" wicket:id="failureSelector" style="margin-top: 0px;margin-bottom: 0px;"/>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="container">
-        <div class="eventLabel">
-          <div id="divtablerow-eventLabel" wicket:id="categoryView">
-            <div class="eventLabel">
-              <span wicket:id="subcategory">[subcategory]</span>
-            </div>
-          </div>
-        </div>
-
-        <div id="divtablerow-success" class="divtablecheckcolumn">
-          <span wicket:id="successGroup">
-            <div wicket:id="successView" class="divtablecheck">
-              <div class="divtableheadereventLabel">&nbsp;</div>
-              <input type="checkbox" wicket:id="successCheck"/>
-            </div>
-          </span>
-        </div>
-
-        <div id="divtablerow-failure" class="divtablecheckcolumn">
-          <span wicket:id="failureGroup">
-            <div wicket:id="failureView" class="divtablecheck">
-              <div class="divtableheadereventLabel">&nbsp;</div>
-              <input type="checkbox" wicket:id="failureCheck"/>
-            </div>
-          </span>
-        </div>
-      </div>
-    </div>
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/notifications/LoggerCategoryPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/LoggerCategoryPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/LoggerCategoryPanel.html
deleted file mode 100644
index 03213b7..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/LoggerCategoryPanel.html
+++ /dev/null
@@ -1,91 +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>
-
-      .events{
-        display: table-row;
-        width: 990px;
-      }
-
-      .selectedEvents{
-        display: inline-block;
-        height: 100px;
-        margin: 10px 10px 0 10px;
-        overflow-y: auto;
-      }
-
-      .eventSelection{
-        display: inline-table;
-        float: right;
-        width: 380px;
-        min-width: 380px;
-      }
-
-      .eventSelection div#eventElement{
-        display: table-row;
-        width:100%;
-      }
-      .eventSelection div#eventElement div#eventLabel{
-        display: table-cell;
-      }
-
-      .eventSelection div#eventElement div#value{
-        display: table-cell;
-        padding: 0 0 0 10px;
-      }
-    </style>
-  </wicket:head>
-  <wicket:panel>
-
-    <div class="events">
-      <div class="selectedEvents">
-        <span wicket:id="selectedEventsPanel">[selected events panel]</span>
-      </div>
-
-      <div class="eventSelection">
-        <div wicket:id="categoryContainer">
-          <div>
-            <span wicket:id="type">[type]</span>
-          </div>
-          <div>
-            <span wicket:id="category">[category]</span>
-          </div>
-          <div>
-            <span wicket:id="subcategory">[sub-category]</span>
-          </div>
-          <div>
-            <div id="eventLabel">
-              <eventLabel wicket:id="customLabel"/>
-            </div>
-            <div id="value">
-              <span wicket:id="custom">[custom]</span>
-              <span wicket:id="customActions">[actions]</span>
-            </div>
-          </div>
-        </div>
-        <div wicket:id="eventsContainer">
-          <span wicket:id="eventsPanel">[events panel]</span>
-        </div>
-      </div>
-    </div>
-
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/notifications/SelectedEventsPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/SelectedEventsPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/notifications/SelectedEventsPanel.html
deleted file mode 100644
index 3ef0354..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/notifications/SelectedEventsPanel.html
+++ /dev/null
@@ -1,33 +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>
-      div#selectionContainer select{
-        width: 585px;
-        min-width: 585px;
-      }
-    </style>
-  </wicket:head>
-  <wicket:panel>
-    <div id="selectionContainer" wicket:id="selectionContainer">
-      <select wicket:id="selectedEvents" ></select>
-    </div>
-  </wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/pages/Audit.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Audit.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Audit.html
new file mode 100644
index 0000000..b4d51d6
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Audit.html
@@ -0,0 +1,38 @@
+<!--
+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>
+    <section class="content-header">
+      <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="configuration"/></li>
+        <li class="active"><wicket:message key="audit"/></li>
+      </ol>
+    </section>
+
+    <section class="content" wicket:id="content">
+      <div class="box">
+        <form wicket:id="auditForm">
+          <div class="box-body" wicket:id="auditPanel"/>
+        </form>
+      </div>
+    </section>
+  </wicket:extend>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
index 5fee51a..d2eb696 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
@@ -104,14 +104,15 @@ under the License.
             <li wicket:id="configurationLI" class="treeview">
               <a href="#"><i class="fa fa-edit"></i><span><wicket:message key="configuration"/></span> <i class="fa fa-angle-left pull-right"></i></a>
               <ul wicket:id="configurationUL" class="treeview-menu">
-                <li wicket:id="rolesLI"><a href="#" wicket:id="roles"><i class="fa fa-users"></i><wicket:message key="roles"/></a></li>
-                <li wicket:id="policiesLI"><a href="#" wicket:id="policies"><i class="fa fa-list"></i><wicket:message key="policies"/></a></li>
-                <li wicket:id="securityquestionsLI"><a href="#" wicket:id="securityquestions"><i class="fa fa-question"></i><wicket:message key="securityQuestions"/></a></li>
-                <li wicket:id="workflowLI"><a href="#" wicket:id="workflow"><i class="fa fa-share-alt"></i><wicket:message key="workflow"/></a></li>
+                <li wicket:id="auditLI"><a href="#" wicket:id="audit"><i class="fa fa-check-square-o"></i><wicket:message key="audit"/></a></li>
                 <li wicket:id="logsLI"><a href="#" wicket:id="logs"><i class="fa fa-file-text-o"></i><wicket:message key="logs"/></a></li>
-                <li wicket:id="typesLI"><a href="#" wicket:id="types"><i class="fa fa-wrench"></i><wicket:message key="types"/></a></li>
                 <li wicket:id="notificationsLI"><a href="#" wicket:id="notifications"><i class="fa fa-envelope-o"></i><wicket:message key="notifications"/></a></li>
                 <li wicket:id="parametersLI"><a href="#" wicket:id="parameters"><i class="fa fa-cog"></i><wicket:message key="parameters"/></a></li>
+                <li wicket:id="policiesLI"><a href="#" wicket:id="policies"><i class="fa fa-list"></i><wicket:message key="policies"/></a></li>
+                <li wicket:id="rolesLI"><a href="#" wicket:id="roles"><i class="fa fa-users"></i><wicket:message key="roles"/></a></li>
+                <li wicket:id="securityquestionsLI"><a href="#" wicket:id="securityquestions"><i class="fa fa-question"></i><wicket:message key="securityQuestions"/></a></li>
+                <li wicket:id="typesLI"><a href="#" wicket:id="types"><i class="fa fa-wrench"></i><wicket:message key="types"/></a></li>
+                <li wicket:id="workflowLI"><a href="#" wicket:id="workflow"><i class="fa fa-share-alt"></i><wicket:message key="workflow"/></a></li>
               </ul>
             </li>
             <li wicket:id="extensionsLI" class="treeview">

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 f2b070e..d1be46a 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
@@ -37,7 +37,7 @@ under the License.
           <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-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-eye"></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>
           <li><i class="fa fa-chevron-circle-right"></i><a href="#" wicket:id="push"><wicket:message key="task.push.list"/></a></li>

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
index 5e89dcf..25eaf9e 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/AuditLoggerName.java
@@ -86,7 +86,6 @@ public class AuditLoggerName extends AbstractBaseBean {
                 append(buildEvent(type, category, subcategory, event, result)).toString();
     }
 
-    @SuppressWarnings("unchecked")
     public static AuditLoggerName fromLoggerName(final String loggerName)
             throws ParseException {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
index 9f9dfde..a8c6f04 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/LoggerWrapper.java
@@ -32,25 +32,25 @@ public final class LoggerWrapper {
     }
 
     public static List<AuditLoggerName> wrap(final Collection<LoggerTO> logger) {
-        List<AuditLoggerName> respons = new ArrayList<>();
+        List<AuditLoggerName> result = new ArrayList<>();
         for (LoggerTO loggerTO : logger) {
             try {
-                respons.add(AuditLoggerName.fromLoggerName(loggerTO.getKey()));
+                result.add(AuditLoggerName.fromLoggerName(loggerTO.getKey()));
             } catch (Exception ignore) {
                 // ignore
             }
         }
-        return respons;
+        return result;
     }
 
     public static List<LoggerTO> unwrap(final Collection<AuditLoggerName> auditNames) {
-        List<LoggerTO> respons = new ArrayList<>();
+        List<LoggerTO> result = new ArrayList<>();
         for (AuditLoggerName name : auditNames) {
             LoggerTO loggerTO = new LoggerTO();
             loggerTO.setKey(name.toLoggerName());
             loggerTO.setLevel(LoggerLevel.DEBUG);
-            respons.add(loggerTO);
+            result.add(loggerTO);
         }
-        return respons;
+        return result;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
index 0879b60..fcdab01 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
@@ -20,7 +20,6 @@ package org.apache.syncope.common.rest.api.service;
 
 import java.util.List;
 import javax.validation.constraints.NotNull;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/fit/console-reference/src/main/resources/console.properties
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/main/resources/console.properties b/fit/console-reference/src/main/resources/console.properties
index a4e833c..73acb0a 100644
--- a/fit/console-reference/src/main/resources/console.properties
+++ b/fit/console-reference/src/main/resources/console.properties
@@ -37,6 +37,7 @@ page.realms=org.apache.syncope.client.console.pages.Realms
 page.topology=org.apache.syncope.client.console.topology.Topology
 page.reports=org.apache.syncope.client.console.pages.Reports
 page.workflow=org.apache.syncope.client.console.pages.Workflow
+page.audit=org.apache.syncope.client.console.pages.Audit
 page.logs=org.apache.syncope.client.console.pages.Logs
 page.securityquestions=org.apache.syncope.client.console.pages.SecurityQuestions
 page.types=org.apache.syncope.client.console.pages.Types

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/fit/core-reference/src/test/resources/console.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/resources/console.properties b/fit/core-reference/src/test/resources/console.properties
index a4e833c..73acb0a 100644
--- a/fit/core-reference/src/test/resources/console.properties
+++ b/fit/core-reference/src/test/resources/console.properties
@@ -37,6 +37,7 @@ page.realms=org.apache.syncope.client.console.pages.Realms
 page.topology=org.apache.syncope.client.console.topology.Topology
 page.reports=org.apache.syncope.client.console.pages.Reports
 page.workflow=org.apache.syncope.client.console.pages.Workflow
+page.audit=org.apache.syncope.client.console.pages.Audit
 page.logs=org.apache.syncope.client.console.pages.Logs
 page.securityquestions=org.apache.syncope.client.console.pages.SecurityQuestions
 page.types=org.apache.syncope.client.console.pages.Types


[5/5] syncope git commit: [SYNCOPE-745] Audit

Posted by il...@apache.org.
[SYNCOPE-745] Audit


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

Branch: refs/heads/master
Commit: 052cf6b16459b5f60838e35d4968d27c535bc3f1
Parents: 3b16483
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Apr 29 16:24:09 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Apr 29 16:24:09 2016 +0200

----------------------------------------------------------------------
 .../console/commons/TaskDataProvider.java       |   3 +-
 .../status/AbstractStatusBeanProvider.java      |   2 +-
 .../console/events/EventCategoryPanel.java      | 498 ++++++++++++++++++
 .../console/events/EventSelectionPanel.java     | 220 ++++++++
 .../console/events/SelectedEventsPanel.java     | 172 +++++++
 .../notifications/EventSelectionPanel.java      | 240 ---------
 .../notifications/LoggerCategoryPanel.java      | 509 -------------------
 .../MailTemplateDirectoryPanel.java             |   4 +-
 .../NotificationDirectoryPanel.java             |  22 +-
 .../notifications/NotificationHandler.java      | 131 -----
 .../NotificationWizardBuilder.java              |  34 +-
 .../notifications/NotificationWrapper.java      | 131 +++++
 .../notifications/SelectedEventsPanel.java      | 172 -------
 .../syncope/client/console/pages/Audit.java     | 127 +++++
 .../syncope/client/console/pages/BasePage.java  |   6 +
 .../syncope/client/console/pages/Roles.java     |   4 +-
 .../AnyObjectDisplayAttributesModalPanel.java   |   2 +-
 .../panels/DisplayAttributesModalPanel.java     |   2 +-
 .../GroupDisplayAttributesModalPanel.java       |   2 +-
 .../console/panels/RoleDirectoryPanel.java      |  12 +-
 .../client/console/panels/SchemaTypePanel.java  |   3 +-
 .../panels/TypeExtensionDirectoryPanel.java     |   1 -
 .../panels/UserDisplayAttributesModalPanel.java |   2 +-
 .../console/reports/ReportDirectoryPanel.java   |  12 +-
 .../reports/ReportTemplateDirectoryPanel.java   |   4 +-
 .../console/reports/ReportWizardBuilder.java    |   2 +-
 .../console/rest/NotificationRestClient.java    |   4 +-
 .../client/console/rest/ReportRestClient.java   |   2 +-
 .../client/console/rest/TemplateRestClient.java |   2 +-
 .../console/tasks/SchedTaskDirectoryPanel.java  |   3 +-
 .../console/tasks/TaskDirectoryPanel.java       |   1 -
 .../console/wizards/any/DynamicMemberships.java |  10 +-
 .../client/console/wizards/any/Ownership.java   |  26 +-
 .../console/wizards/role/RoleHandler.java       |  74 ---
 .../console/wizards/role/RoleWizardBuilder.java |  16 +-
 .../console/wizards/role/RoleWrapper.java       |  74 +++
 .../META-INF/resources/css/syncopeConsole.css   |  47 +-
 .../src/main/resources/console.properties       |   1 +
 .../SyncopeConsoleApplication.properties        |   1 +
 .../SyncopeConsoleApplication_it.properties     |   1 +
 .../SyncopeConsoleApplication_pt_BR.properties  |   1 +
 .../SyncopeConsoleApplication_ru.properties     |   1 +
 .../console/events/EventCategoryPanel.html      |  53 ++
 .../console/events/EventSelectionPanel.html     | 125 +++++
 .../console/events/SelectedEventsPanel.html     |  25 +
 .../notifications/EventSelectionPanel.html      | 125 -----
 .../notifications/LoggerCategoryPanel.html      |  91 ----
 .../notifications/SelectedEventsPanel.html      |  33 --
 .../syncope/client/console/pages/Audit.html     |  38 ++
 .../syncope/client/console/pages/BasePage.html  |  11 +-
 .../console/topology/TopologyTogglePanel.html   |   2 +-
 .../common/lib/types/AuditLoggerName.java       |   1 -
 .../syncope/common/rest/api/LoggerWrapper.java  |  12 +-
 .../common/rest/api/service/LoggerService.java  |   1 -
 .../src/main/resources/console.properties       |   1 +
 .../src/test/resources/console.properties       |   1 +
 56 files changed, 1619 insertions(+), 1481 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java
index 9f6db89..6a57c2e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/TaskDataProvider.java
@@ -37,9 +37,8 @@ public abstract class TaskDataProvider<T extends AbstractTaskTO> extends Directo
 
     public TaskDataProvider(final int paginatorRows, final TaskType taskType, final TaskRestClient taskRestClient) {
         super(paginatorRows);
-        this.taskRestClient = taskRestClient;
 
-        //Default sorting
+        this.taskRestClient = taskRestClient;
         setSort("key", SortOrder.DESCENDING);
         comparator = new SortableDataProviderComparator<>(this);
         this.taskType = taskType;

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java
index 48227e0..7d9a688 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/AbstractStatusBeanProvider.java
@@ -35,7 +35,7 @@ public abstract class AbstractStatusBeanProvider extends DirectoryDataProvider<S
 
     public AbstractStatusBeanProvider(final String sort) {
         super(10);
-        //Default sorting
+
         setSort(sort, SortOrder.ASCENDING);
         comparator = new SortableDataProviderComparator<>(this);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
new file mode 100644
index 0000000..9277212
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
@@ -0,0 +1,498 @@
+/*
+ * 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.events;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.events.SelectedEventsPanel.EventSelectionChanged;
+import org.apache.syncope.client.console.events.SelectedEventsPanel.InspectSelectedEvent;
+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.wicket.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.common.lib.to.EventCategoryTO;
+import org.apache.syncope.common.lib.types.AuditElements;
+import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType;
+import org.apache.syncope.common.lib.types.AuditLoggerName;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.IChoiceRenderer;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+public abstract class EventCategoryPanel extends Panel {
+
+    private static final long serialVersionUID = 6429053774964787734L;
+
+    private final List<EventCategoryTO> eventCategoryTOs;
+
+    private final EventCategoryTO eventCategoryTO = new EventCategoryTO();
+
+    private final WebMarkupContainer categoryContainer;
+
+    private final WebMarkupContainer eventsContainer;
+
+    private final SelectedEventsPanel selectedEventsPanel;
+
+    private final AjaxDropDownChoicePanel<EventCategoryType> type;
+
+    private final AjaxDropDownChoicePanel<String> category;
+
+    private final AjaxDropDownChoicePanel<String> subcategory;
+
+    private final AjaxTextFieldPanel custom;
+
+    private final ActionLinksPanel<EventCategoryTO> actionLinksPanel;
+
+    private final IModel<List<String>> model;
+
+    public EventCategoryPanel(
+            final String id,
+            final List<EventCategoryTO> eventCategoryTOs,
+            final IModel<List<String>> model) {
+
+        super(id);
+
+        this.model = model;
+        selectedEventsPanel = new SelectedEventsPanel("selectedEventsPanel", model);
+        add(selectedEventsPanel);
+
+        this.eventCategoryTOs = eventCategoryTOs;
+
+        categoryContainer = new WebMarkupContainer("categoryContainer");
+        categoryContainer.setOutputMarkupId(true);
+        add(categoryContainer);
+
+        eventsContainer = new WebMarkupContainer("eventsContainer");
+        eventsContainer.setOutputMarkupId(true);
+        add(eventsContainer);
+
+        authorizeList();
+        authorizeChanges();
+
+        type = new AjaxDropDownChoicePanel<>(
+                "type",
+                "type",
+                new PropertyModel<EventCategoryType>(eventCategoryTO, "type"),
+                false);
+        type.setChoices(Arrays.asList(EventCategoryType.values()));
+        type.setStyleSheet("ui-widget-content ui-corner-all");
+        type.setChoiceRenderer(new IChoiceRenderer<EventCategoryType>() {
+
+            private static final long serialVersionUID = 2317134950949778735L;
+
+            @Override
+            public String getDisplayValue(final EventCategoryType eventCategoryType) {
+                return eventCategoryType.name();
+            }
+
+            @Override
+            public String getIdValue(final EventCategoryType eventCategoryType, final int i) {
+                return eventCategoryType.name();
+            }
+
+            @Override
+            public EventCategoryType getObject(
+                    final String id, final IModel<? extends List<? extends EventCategoryType>> choices) {
+                return IterableUtils.find(choices.getObject(), new Predicate<EventCategoryType>() {
+
+                    @Override
+                    public boolean evaluate(final EventCategoryType object) {
+                        return object.name().equals(id);
+                    }
+                });
+            }
+        });
+        categoryContainer.add(type);
+
+        type.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                send(EventCategoryPanel.this, Broadcast.EXACT, new ChangeCategoryEvent(target, type));
+            }
+        });
+
+        category = new AjaxDropDownChoicePanel<>(
+                "category",
+                "category",
+                new PropertyModel<String>(eventCategoryTO, "category"),
+                false);
+        category.setChoices(filter(eventCategoryTOs, type.getModelObject()));
+        categoryContainer.add(category);
+
+        category.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306811L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                send(EventCategoryPanel.this, Broadcast.EXACT, new ChangeCategoryEvent(target, category));
+            }
+        });
+
+        subcategory = new AjaxDropDownChoicePanel<>(
+                "subcategory",
+                "subcategory",
+                new PropertyModel<String>(eventCategoryTO, "subcategory"),
+                false);
+        subcategory.setChoices(filter(eventCategoryTOs, type.getModelObject(), category.getModelObject()));
+        categoryContainer.add(subcategory);
+
+        subcategory.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306812L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                send(EventCategoryPanel.this, Broadcast.EXACT, new ChangeCategoryEvent(target, subcategory));
+            }
+        });
+
+        categoryContainer.add(new Label("customLabel", new ResourceModel("custom", "custom")).setVisible(false));
+
+        custom = new AjaxTextFieldPanel("custom", "custom", new Model<String>(null));
+        custom.setVisible(false);
+        custom.setEnabled(false);
+
+        categoryContainer.add(custom.hideLabel());
+
+        actionLinksPanel = ActionLinksPanel.<EventCategoryTO>builder().
+                add(new ActionLink<EventCategoryTO>() {
+
+                    private static final long serialVersionUID = -3722207913631435501L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
+                        if (StringUtils.isNotBlank(custom.getModelObject())) {
+                            Map.Entry<EventCategoryTO, AuditElements.Result> parsed =
+                                    AuditLoggerName.parseEventCategory(custom.getModelObject());
+
+                            String eventString = AuditLoggerName.buildEvent(
+                                    parsed.getKey().getType(),
+                                    null,
+                                    null,
+                                    parsed.getKey().getEvents().isEmpty()
+                                            ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
+                                    parsed.getValue());
+
+                            custom.setModelObject(StringUtils.EMPTY);
+                            send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
+                                    target,
+                                    Collections.<String>singleton(eventString),
+                                    Collections.<String>emptySet()));
+                            target.add(categoryContainer);
+                        }
+                    }
+                }, ActionLink.ActionType.CREATE).
+                add(new ActionLink<EventCategoryTO>() {
+
+                    private static final long serialVersionUID = -3722207913631435501L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
+                        if (StringUtils.isNotBlank(custom.getModelObject())) {
+                            Pair<EventCategoryTO, AuditElements.Result> parsed =
+                                    AuditLoggerName.parseEventCategory(custom.getModelObject());
+
+                            String eventString = AuditLoggerName.buildEvent(
+                                    parsed.getKey().getType(),
+                                    null,
+                                    null,
+                                    parsed.getKey().getEvents().isEmpty()
+                                            ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
+                                    parsed.getValue());
+
+                            custom.setModelObject(StringUtils.EMPTY);
+                            send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
+                                    target,
+                                    Collections.<String>singleton(eventString),
+                                    Collections.<String>emptySet()));
+                            target.add(categoryContainer);
+                        }
+                    }
+                }, ActionLink.ActionType.CREATE).
+                add(new ActionLink<EventCategoryTO>() {
+
+                    private static final long serialVersionUID = -3722207913631435521L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
+                        if (StringUtils.isNotBlank(custom.getModelObject())) {
+                            Pair<EventCategoryTO, AuditElements.Result> parsed =
+                                    AuditLoggerName.parseEventCategory(custom.getModelObject());
+
+                            String eventString = AuditLoggerName.buildEvent(
+                                    parsed.getKey().getType(),
+                                    null,
+                                    null,
+                                    parsed.getKey().getEvents().isEmpty()
+                                            ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
+                                    parsed.getValue());
+
+                            custom.setModelObject(StringUtils.EMPTY);
+                            send(EventCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
+                                    target,
+                                    Collections.<String>emptySet(),
+                                    Collections.<String>singleton(eventString)));
+                            target.add(categoryContainer);
+                        }
+                    }
+                }, ActionLink.ActionType.DELETE).build("customActions");
+
+        categoryContainer.add(actionLinksPanel);
+
+        actionLinksPanel.setVisible(false);
+        actionLinksPanel.setEnabled(false);
+
+        eventsContainer.add(new EventSelectionPanel("eventsPanel", eventCategoryTO, model) {
+
+            private static final long serialVersionUID = 3513194801190026082L;
+
+            @Override
+            protected void onEventAction(final IEvent<?> event) {
+                EventCategoryPanel.this.onEventAction(event);
+            }
+        });
+    }
+
+    private List<String> filter(final List<EventCategoryTO> eventCategoryTOs, final EventCategoryType type) {
+        Set<String> res = new HashSet<>();
+
+        for (EventCategoryTO eventCategory : eventCategoryTOs) {
+            if (type == eventCategory.getType() && StringUtils.isNotEmpty(eventCategory.getCategory())) {
+                res.add(eventCategory.getCategory());
+            }
+        }
+
+        List<String> filtered = new ArrayList<>(res);
+        Collections.sort(filtered);
+        return filtered;
+    }
+
+    private List<String> filter(
+            final List<EventCategoryTO> eventCategoryTOs, final EventCategoryType type, final String category) {
+
+        Set<String> res = new HashSet<>();
+
+        for (EventCategoryTO eventCategory : eventCategoryTOs) {
+            if (type == eventCategory.getType() && StringUtils.equals(category, eventCategory.getCategory())
+                    && StringUtils.isNotEmpty(eventCategory.getSubcategory())) {
+                res.add(eventCategory.getSubcategory());
+            }
+        }
+
+        List<String> filtered = new ArrayList<>(res);
+        Collections.sort(filtered);
+        return filtered;
+    }
+
+    @Override
+    public void onEvent(final IEvent<?> event) {
+        if (event.getPayload() instanceof ChangeCategoryEvent) {
+            // update objects ....
+            eventCategoryTO.getEvents().clear();
+
+            final ChangeCategoryEvent change = (ChangeCategoryEvent) event.getPayload();
+
+            final Panel changedPanel = change.getChangedPanel();
+            if (null != changedPanel.getId()) {
+                switch (changedPanel.getId()) {
+                    case "type":
+                        eventCategoryTO.setType(type.getModelObject());
+                        eventCategoryTO.setCategory(null);
+                        eventCategoryTO.setSubcategory(null);
+                        if (type.getModelObject() == EventCategoryType.CUSTOM) {
+                            category.setChoices(Collections.<String>emptyList());
+                            subcategory.setChoices(Collections.<String>emptyList());
+                            category.setEnabled(false);
+                            subcategory.setEnabled(false);
+                            custom.setVisible(true);
+                            custom.setEnabled(true);
+                            actionLinksPanel.setVisible(true);
+                            actionLinksPanel.setEnabled(true);
+                        } else {
+                            category.setChoices(filter(eventCategoryTOs, type.getModelObject()));
+                            subcategory.setChoices(Collections.<String>emptyList());
+                            category.setEnabled(true);
+                            subcategory.setEnabled(true);
+                            custom.setVisible(false);
+                            custom.setEnabled(false);
+                            actionLinksPanel.setVisible(false);
+                            actionLinksPanel.setEnabled(false);
+                        }
+                        change.getTarget().add(categoryContainer);
+                        break;
+
+                    case "category":
+                        subcategory.setChoices(
+                                filter(eventCategoryTOs, type.getModelObject(), category.getModelObject()));
+                        eventCategoryTO.setCategory(category.getModelObject());
+                        eventCategoryTO.setSubcategory(null);
+                        change.getTarget().add(categoryContainer);
+                        break;
+
+                    default:
+                        eventCategoryTO.setSubcategory(subcategory.getModelObject());
+                        break;
+                }
+            }
+
+            updateEventsContainer(change.getTarget());
+        } else if (event.getPayload() instanceof InspectSelectedEvent) {
+            // update objects ....
+            eventCategoryTO.getEvents().clear();
+
+            final InspectSelectedEvent inspectSelectedEvent = (InspectSelectedEvent) event.getPayload();
+
+            final Map.Entry<EventCategoryTO, AuditElements.Result> categoryEvent = AuditLoggerName.parseEventCategory(
+                    inspectSelectedEvent.getEvent());
+
+            eventCategoryTO.setType(categoryEvent.getKey().getType());
+            category.setChoices(filter(eventCategoryTOs, type.getModelObject()));
+
+            eventCategoryTO.setCategory(categoryEvent.getKey().getCategory());
+            subcategory.setChoices(filter(eventCategoryTOs, type.getModelObject(), category.getModelObject()));
+
+            eventCategoryTO.setSubcategory(categoryEvent.getKey().getSubcategory());
+
+            if (categoryEvent.getKey().getType() == EventCategoryType.CUSTOM) {
+                custom.setModelObject(AuditLoggerName.buildEvent(
+                        categoryEvent.getKey().getType(),
+                        categoryEvent.getKey().getCategory(),
+                        categoryEvent.getKey().getSubcategory(),
+                        categoryEvent.getKey().getEvents().isEmpty()
+                                ? StringUtils.EMPTY : categoryEvent.getKey().getEvents().iterator().next(),
+                        categoryEvent.getValue()));
+
+                category.setEnabled(false);
+                subcategory.setEnabled(false);
+                custom.setVisible(true);
+                custom.setEnabled(true);
+                actionLinksPanel.setVisible(true);
+                actionLinksPanel.setEnabled(true);
+            } else {
+                category.setEnabled(true);
+                subcategory.setEnabled(true);
+                custom.setVisible(false);
+                custom.setEnabled(false);
+                actionLinksPanel.setVisible(false);
+                actionLinksPanel.setEnabled(false);
+            }
+
+            inspectSelectedEvent.getTarget().add(categoryContainer);
+            updateEventsContainer(inspectSelectedEvent.getTarget());
+        }
+    }
+
+    private void setEvents() {
+        final Iterator<EventCategoryTO> itor = eventCategoryTOs.iterator();
+        while (itor.hasNext() && eventCategoryTO.getEvents().isEmpty()) {
+            final EventCategoryTO eventCategory = itor.next();
+            if (eventCategory.getType() == eventCategoryTO.getType()
+                    && StringUtils.equals(eventCategory.getCategory(), eventCategoryTO.getCategory())
+                    && StringUtils.equals(eventCategory.getSubcategory(), eventCategoryTO.getSubcategory())) {
+                eventCategoryTO.getEvents().addAll(eventCategory.getEvents());
+
+            }
+        }
+    }
+
+    private class ChangeCategoryEvent {
+
+        private final AjaxRequestTarget target;
+
+        private final Panel changedPanel;
+
+        ChangeCategoryEvent(final AjaxRequestTarget target, final Panel changedPanel) {
+            this.target = target;
+            this.changedPanel = changedPanel;
+        }
+
+        public AjaxRequestTarget getTarget() {
+            return target;
+        }
+
+        public Panel getChangedPanel() {
+            return changedPanel;
+        }
+    }
+
+    /**
+     * To be extended in order to add actions on events.
+     *
+     * @param event event.
+     */
+    protected void onEventAction(final IEvent<?> event) {
+        // nothing by default
+    }
+
+    private void authorizeList() {
+        for (String role : getListAuthRoles()) {
+            MetaDataRoleAuthorizationStrategy.authorize(selectedEventsPanel, RENDER, role);
+        }
+    }
+
+    private void authorizeChanges() {
+        for (String role : getChangeAuthRoles()) {
+            MetaDataRoleAuthorizationStrategy.authorize(categoryContainer, RENDER, role);
+            MetaDataRoleAuthorizationStrategy.authorize(eventsContainer, RENDER, role);
+        }
+    }
+
+    private void updateEventsContainer(final AjaxRequestTarget target) {
+        setEvents();
+
+        eventsContainer.addOrReplace(new EventSelectionPanel("eventsPanel", eventCategoryTO, model) {
+
+            private static final long serialVersionUID = 3513194801190026082L;
+
+            @Override
+            public void onEventAction(final IEvent<?> event) {
+                EventCategoryPanel.this.onEventAction(event);
+            }
+        });
+        target.add(eventsContainer);
+    }
+
+    protected abstract List<String> getListAuthRoles();
+
+    protected abstract List<String> getChangeAuthRoles();
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/events/EventSelectionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/events/EventSelectionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/events/EventSelectionPanel.java
new file mode 100644
index 0000000..54a4506
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/events/EventSelectionPanel.java
@@ -0,0 +1,220 @@
+/*
+ * 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.events;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormChoiceComponentUpdatingBehavior;
+import org.apache.syncope.common.lib.to.EventCategoryTO;
+import org.apache.syncope.common.lib.types.AuditElements;
+import org.apache.syncope.common.lib.types.AuditLoggerName;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Check;
+import org.apache.wicket.markup.html.form.CheckGroup;
+import org.apache.wicket.markup.html.form.CheckGroupSelector;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
+
+public abstract class EventSelectionPanel extends Panel {
+
+    private static final long serialVersionUID = 752233163798301002L;
+
+    private final Set<String> selected = new HashSet<>();
+
+    public EventSelectionPanel(
+            final String id, final EventCategoryTO eventCategoryTO, final IModel<List<String>> model) {
+        super(id);
+        setOutputMarkupId(true);
+
+        List<String> events = getEvents(eventCategoryTO);
+
+        // needed to avoid model reset: model have to be managed into SelectedEventsPanel
+        selected.addAll(model.getObject());
+
+        final CheckGroup<String> successGroup = new CheckGroup<>("successGroup", selected);
+        successGroup.add(new IndicatorAjaxFormChoiceComponentUpdatingBehavior() {
+
+            private static final long serialVersionUID = -151291731388673682L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+
+                final Set<String> toBeRemoved = new HashSet<>();
+                final Set<String> toBeAdded = new HashSet<>();
+
+                for (String event : getEvents(eventCategoryTO)) {
+                    String eventString = AuditLoggerName.buildEvent(
+                            eventCategoryTO.getType(),
+                            eventCategoryTO.getCategory(),
+                            eventCategoryTO.getSubcategory(),
+                            event,
+                            AuditElements.Result.SUCCESS);
+
+                    if (successGroup.getModelObject().contains(eventString)) {
+                        toBeAdded.add(eventString);
+                    } else {
+                        toBeRemoved.add(eventString);
+                    }
+                }
+
+                send(EventSelectionPanel.this.getPage(), Broadcast.BREADTH,
+                        new SelectedEventsPanel.EventSelectionChanged(target, toBeAdded, toBeRemoved));
+            }
+        });
+        successGroup.setVisible(!events.isEmpty());
+        add(successGroup);
+
+        add(new Label("successLabel", new ResourceModel("Success", "Success"))).setVisible(!events.isEmpty());
+
+        CheckGroupSelector successSelector = new CheckGroupSelector("successSelector", successGroup);
+        successSelector.setVisible(!events.isEmpty());
+        add(successSelector);
+
+        ListView<String> categoryView = new ListView<String>("categoryView", events) {
+
+            private static final long serialVersionUID = 4949588177564901031L;
+
+            @Override
+            protected void populateItem(final ListItem<String> item) {
+                final String subcategory = item.getModelObject();
+
+                item.add(new Label("subcategory", new ResourceModel(subcategory, subcategory)));
+            }
+        };
+        add(categoryView);
+
+        ListView<String> successView = new ListView<String>("successView", events) {
+
+            private static final long serialVersionUID = 4949588177564901031L;
+
+            @Override
+            protected void populateItem(final ListItem<String> item) {
+                item.add(new Check<>("successCheck",
+                        new Model<>(AuditLoggerName.buildEvent(
+                                eventCategoryTO.getType(),
+                                eventCategoryTO.getCategory(),
+                                eventCategoryTO.getSubcategory(),
+                                item.getModelObject(),
+                                AuditElements.Result.SUCCESS)),
+                        successGroup));
+            }
+        };
+        successGroup.add(successView);
+
+        final CheckGroup<String> failureGroup = new CheckGroup<>("failureGroup", selected);
+        failureGroup.add(new IndicatorAjaxFormChoiceComponentUpdatingBehavior() {
+
+            private static final long serialVersionUID = -151291731388673682L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                final Set<String> toBeRemoved = new HashSet<>();
+                final Set<String> toBeAdded = new HashSet<>();
+
+                for (String event : getEvents(eventCategoryTO)) {
+                    final String eventString = AuditLoggerName.buildEvent(
+                            eventCategoryTO.getType(),
+                            eventCategoryTO.getCategory(),
+                            eventCategoryTO.getSubcategory(),
+                            event,
+                            AuditElements.Result.FAILURE);
+
+                    if (failureGroup.getModelObject().contains(eventString)) {
+                        toBeAdded.add(eventString);
+                    } else {
+                        toBeRemoved.add(eventString);
+                    }
+                }
+
+                send(EventSelectionPanel.this.getPage(), Broadcast.BREADTH,
+                        new SelectedEventsPanel.EventSelectionChanged(target, toBeAdded, toBeRemoved));
+            }
+        });
+        failureGroup.setVisible(!events.isEmpty());
+        add(failureGroup);
+
+        add(new Label("failureLabel", new ResourceModel("Failure", "Failure"))).setVisible(!events.isEmpty());
+
+        CheckGroupSelector failureSelector = new CheckGroupSelector("failureSelector", failureGroup);
+        failureSelector.setVisible(!events.isEmpty());
+        add(failureSelector);
+
+        ListView<String> failureView = new ListView<String>("failureView", events) {
+
+            private static final long serialVersionUID = 4949588177564901031L;
+
+            @Override
+            protected void populateItem(final ListItem<String> item) {
+                item.add(new Check<>("failureCheck",
+                        new Model<>(AuditLoggerName.buildEvent(
+                                eventCategoryTO.getType(),
+                                eventCategoryTO.getCategory(),
+                                eventCategoryTO.getSubcategory(),
+                                item.getModelObject(),
+                                AuditElements.Result.FAILURE)),
+                        failureGroup));
+            }
+        };
+        failureGroup.add(failureView);
+    }
+
+    private List<String> getEvents(final EventCategoryTO eventCategoryTO) {
+        final List<String> res;
+
+        res = eventCategoryTO.getEvents();
+
+        if (res.isEmpty()) {
+            if ((AuditElements.EventCategoryType.PROPAGATION == eventCategoryTO.getType()
+                    || AuditElements.EventCategoryType.PULL == eventCategoryTO.getType()
+                    || AuditElements.EventCategoryType.PUSH == eventCategoryTO.getType())
+                    && StringUtils.isEmpty(eventCategoryTO.getCategory())) {
+                res.add(eventCategoryTO.getType().toString());
+            } else if (AuditElements.EventCategoryType.TASK == eventCategoryTO.getType()
+                    && StringUtils.isNotEmpty(eventCategoryTO.getCategory())) {
+                res.add(eventCategoryTO.getCategory());
+            }
+        } else {
+            Collections.sort(res);
+        }
+
+        return res;
+    }
+
+    /**
+     * To be extended in order to add actions on events.
+     *
+     * @param event event.
+     */
+    protected abstract void onEventAction(final IEvent<?> event);
+
+    @Override
+    public void onEvent(final IEvent<?> event) {
+        onEventAction(event);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/events/SelectedEventsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/events/SelectedEventsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/events/SelectedEventsPanel.java
new file mode 100644
index 0000000..07c3854
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/events/SelectedEventsPanel.java
@@ -0,0 +1,172 @@
+/*
+ * 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.events;
+
+import java.util.List;
+import java.util.Set;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.IChoiceRenderer;
+import org.apache.wicket.markup.html.form.ListMultipleChoice;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.util.ListModel;
+
+public class SelectedEventsPanel extends Panel {
+
+    private static final long serialVersionUID = -4832450230348213500L;
+
+    private final WebMarkupContainer selectionContainer;
+
+    private ListMultipleChoice<String> selectedEvents;
+
+    private final IModel<List<String>> model;
+
+    public SelectedEventsPanel(final String id, final IModel<List<String>> model) {
+        super(id);
+
+        this.model = model;
+
+        selectionContainer = new WebMarkupContainer("selectionContainer");
+        selectionContainer.setOutputMarkupId(true);
+        add(selectionContainer);
+
+        selectedEvents = new ListMultipleChoice<String>("selectedEvents", new ListModel<String>(), model) {
+
+            private static final long serialVersionUID = 1226677544225737338L;
+
+            @Override
+            protected void onComponentTag(final ComponentTag tag) {
+                super.onComponentTag(tag);
+                tag.remove("size");
+                tag.remove("multiple");
+                tag.put("size", 5);
+            }
+        };
+
+        selectedEvents.setMaxRows(5);
+        selectedEvents.setChoiceRenderer(new IChoiceRenderer<String>() {
+
+            private static final long serialVersionUID = -4288397951948436434L;
+
+            @Override
+            public Object getDisplayValue(final String object) {
+                return object;
+            }
+
+            @Override
+            public String getIdValue(final String object, final int index) {
+                return object;
+            }
+
+            @Override
+            public String getObject(final String id, final IModel<? extends List<? extends String>> choices) {
+                return id;
+            }
+        });
+
+        selectedEvents.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -151291731388673682L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                send(SelectedEventsPanel.this.getPage(),
+                        Broadcast.BREADTH,
+                        new InspectSelectedEvent(target, selectedEvents.getModelValue()));
+            }
+        });
+
+        selectionContainer.add(selectedEvents);
+    }
+
+    @Override
+    public void onEvent(final IEvent<?> event) {
+        if (event.getPayload() instanceof EventSelectionChanged) {
+            final EventSelectionChanged eventSelectionChanged = (EventSelectionChanged) event.getPayload();
+
+            for (String toBeRemoved : eventSelectionChanged.getToBeRemoved()) {
+                model.getObject().remove(toBeRemoved);
+            }
+
+            for (String toBeAdded : eventSelectionChanged.getToBeAdded()) {
+                if (!model.getObject().contains(toBeAdded)) {
+                    model.getObject().add(toBeAdded);
+                }
+            }
+
+            eventSelectionChanged.getTarget().add(selectionContainer);
+        }
+    }
+
+    public static class InspectSelectedEvent {
+
+        private final AjaxRequestTarget target;
+
+        private final String event;
+
+        public InspectSelectedEvent(final AjaxRequestTarget target, final String event) {
+            this.target = target;
+            this.event = event;
+        }
+
+        public AjaxRequestTarget getTarget() {
+            return target;
+        }
+
+        public String getEvent() {
+            return event;
+        }
+    }
+
+    public static class EventSelectionChanged {
+
+        private final AjaxRequestTarget target;
+
+        private final Set<String> toBeRemoved;
+
+        private final Set<String> toBeAdded;
+
+        public EventSelectionChanged(
+                final AjaxRequestTarget target,
+                final Set<String> toBeAdded,
+                final Set<String> toBeRemoved) {
+            this.target = target;
+            this.toBeAdded = toBeAdded;
+            this.toBeRemoved = toBeRemoved;
+        }
+
+        public AjaxRequestTarget getTarget() {
+            return target;
+        }
+
+        public Set<String> getToBeRemoved() {
+            return toBeRemoved;
+        }
+
+        public Set<String> getToBeAdded() {
+            return toBeAdded;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/notifications/EventSelectionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/EventSelectionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/EventSelectionPanel.java
deleted file mode 100644
index 38d2dd9..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/EventSelectionPanel.java
+++ /dev/null
@@ -1,240 +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.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.to.EventCategoryTO;
-import org.apache.syncope.common.lib.types.AuditElements;
-import org.apache.syncope.common.lib.types.AuditLoggerName;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
-import org.apache.wicket.event.Broadcast;
-import org.apache.wicket.event.IEvent;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Check;
-import org.apache.wicket.markup.html.form.CheckGroup;
-import org.apache.wicket.markup.html.form.CheckGroupSelector;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.ResourceModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class EventSelectionPanel extends Panel {
-
-    /**
-     * Logger.
-     */
-    private static final Logger LOG = LoggerFactory.getLogger(EventSelectionPanel.class);
-
-    private static final long serialVersionUID = 752233163798301002L;
-
-    private final Set<String> selected = new HashSet<String>();
-
-    public EventSelectionPanel(
-            final String id, final EventCategoryTO eventCategoryTO, final IModel<List<String>> model) {
-        super(id);
-        setOutputMarkupId(true);
-
-        final List<String> events = getEvents(eventCategoryTO);
-
-        // needed to avoid model reset: model have to be managed into SelectedEventsPanel
-        selected.addAll(model.getObject());
-
-        final CheckGroup<String> successGroup = new CheckGroup<String>(
-                "successGroup",
-                selected);
-
-        successGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() {
-
-            private static final long serialVersionUID = -151291731388673682L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-
-                final Set<String> toBeRemoved = new HashSet<String>();
-                final Set<String> toBeAdded = new HashSet<String>();
-
-                for (String event : getEvents(eventCategoryTO)) {
-                    final String eventString = AuditLoggerName.buildEvent(
-                            eventCategoryTO.getType(),
-                            eventCategoryTO.getCategory(),
-                            eventCategoryTO.getSubcategory(),
-                            event,
-                            AuditElements.Result.SUCCESS);
-
-                    if (successGroup.getModelObject().contains(eventString)) {
-                        toBeAdded.add(eventString);
-                    } else {
-                        toBeRemoved.add(eventString);
-                    }
-                }
-
-                send(EventSelectionPanel.this.getPage(), Broadcast.BREADTH,
-                        new SelectedEventsPanel.EventSelectionChanged(target, toBeAdded, toBeRemoved));
-            }
-        });
-
-        successGroup.setVisible(!events.isEmpty());
-        add(successGroup);
-
-        add(new Label("successLabel", new ResourceModel("Success", "Success"))).setVisible(!events.isEmpty());
-
-        final CheckGroupSelector successSelector = new CheckGroupSelector("successSelector", successGroup);
-        successSelector.setVisible(!events.isEmpty());
-        add(successSelector);
-
-        final ListView<String> categoryView = new ListView<String>("categoryView", events) {
-
-            private static final long serialVersionUID = 4949588177564901031L;
-
-            @Override
-            protected void populateItem(final ListItem<String> item) {
-                final String subcategory = item.getModelObject();
-
-                item.add(new Label("subcategory", new ResourceModel(subcategory, subcategory)));
-            }
-        };
-        add(categoryView);
-
-        final ListView<String> successView = new ListView<String>("successView", events) {
-
-            private static final long serialVersionUID = 4949588177564901031L;
-
-            @Override
-            protected void populateItem(final ListItem<String> item) {
-                final String event = item.getModelObject();
-
-                final Check<String> successCheck = new Check<String>("successCheck",
-                        new Model<String>(AuditLoggerName.buildEvent(
-                                eventCategoryTO.getType(),
-                                eventCategoryTO.getCategory(),
-                                eventCategoryTO.getSubcategory(),
-                                event,
-                                AuditElements.Result.SUCCESS)),
-                        successGroup);
-                item.add(successCheck);
-            }
-        };
-        successGroup.add(successView);
-
-        final CheckGroup<String> failureGroup = new CheckGroup<String>("failureGroup", selected);
-
-        failureGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() {
-
-            private static final long serialVersionUID = -151291731388673682L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-
-                final Set<String> toBeRemoved = new HashSet<String>();
-                final Set<String> toBeAdded = new HashSet<String>();
-
-                for (String event : getEvents(eventCategoryTO)) {
-                    final String eventString = AuditLoggerName.buildEvent(
-                            eventCategoryTO.getType(),
-                            eventCategoryTO.getCategory(),
-                            eventCategoryTO.getSubcategory(),
-                            event,
-                            AuditElements.Result.FAILURE);
-
-                    if (failureGroup.getModelObject().contains(eventString)) {
-                        toBeAdded.add(eventString);
-                    } else {
-                        toBeRemoved.add(eventString);
-                    }
-                }
-
-                send(EventSelectionPanel.this.getPage(), Broadcast.BREADTH,
-                        new SelectedEventsPanel.EventSelectionChanged(target, toBeAdded, toBeRemoved));
-            }
-        });
-
-        failureGroup.setVisible(!events.isEmpty());
-        add(failureGroup);
-
-        add(new Label("failureLabel", new ResourceModel("Failure", "Failure"))).setVisible(!events.isEmpty());
-
-        final CheckGroupSelector failureSelector = new CheckGroupSelector("failureSelector", failureGroup);
-        failureSelector.setVisible(!events.isEmpty());
-        add(failureSelector);
-
-        final ListView<String> failureView = new ListView<String>("failureView", events) {
-
-            private static final long serialVersionUID = 4949588177564901031L;
-
-            @Override
-            protected void populateItem(final ListItem<String> item) {
-                final String event = item.getModelObject();
-
-                final Check<String> failureCheck = new Check<String>("failureCheck",
-                        new Model<String>(AuditLoggerName.buildEvent(
-                                eventCategoryTO.getType(),
-                                eventCategoryTO.getCategory(),
-                                eventCategoryTO.getSubcategory(),
-                                event,
-                                AuditElements.Result.FAILURE)),
-                        failureGroup);
-                item.add(failureCheck);
-            }
-        };
-        failureGroup.add(failureView);
-    }
-
-    private List<String> getEvents(final EventCategoryTO eventCategoryTO) {
-        final List<String> res;
-
-        res = eventCategoryTO.getEvents();
-
-        if (res.isEmpty()) {
-            if ((AuditElements.EventCategoryType.PROPAGATION == eventCategoryTO.getType()
-                    || AuditElements.EventCategoryType.PULL == eventCategoryTO.getType()
-                    || AuditElements.EventCategoryType.PUSH == eventCategoryTO.getType())
-                    && StringUtils.isEmpty(eventCategoryTO.getCategory())) {
-                res.add(eventCategoryTO.getType().toString());
-            } else if (AuditElements.EventCategoryType.TASK == eventCategoryTO.getType()
-                    && StringUtils.isNotEmpty(eventCategoryTO.getCategory())) {
-                res.add(eventCategoryTO.getCategory());
-            }
-        } else {
-            Collections.sort(res);
-        }
-
-        return res;
-    }
-
-    /**
-     * To be extended in order to add actions on events.
-     *
-     * @param event event.
-     */
-    protected abstract void onEventAction(final IEvent<?> event);
-
-    @Override
-    public void onEvent(final IEvent<?> event) {
-        onEventAction(event);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/notifications/LoggerCategoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/LoggerCategoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/LoggerCategoryPanel.java
deleted file mode 100644
index d1715f1..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/LoggerCategoryPanel.java
+++ /dev/null
@@ -1,509 +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.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.notifications.SelectedEventsPanel.EventSelectionChanged;
-import org.apache.syncope.client.console.notifications.SelectedEventsPanel.InspectSelectedEvent;
-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.wicket.markup.html.form.AjaxDropDownChoicePanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.common.lib.to.EventCategoryTO;
-import org.apache.syncope.common.lib.types.AuditElements;
-import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType;
-import org.apache.syncope.common.lib.types.AuditLoggerName;
-import org.apache.syncope.common.lib.types.StandardEntitlement;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
-import org.apache.wicket.event.Broadcast;
-import org.apache.wicket.event.IEvent;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.IChoiceRenderer;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.model.ResourceModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class LoggerCategoryPanel extends Panel {
-
-    /**
-     * Logger.
-     */
-    private static final Logger LOG = LoggerFactory.getLogger(LoggerCategoryPanel.class);
-
-    private static final long serialVersionUID = 6429053774964787734L;
-
-    private final List<EventCategoryTO> eventCategoryTOs;
-
-    private final EventCategoryTO eventCategoryTO = new EventCategoryTO();
-
-    private final WebMarkupContainer categoryContainer;
-
-    private final WebMarkupContainer eventsContainer;
-
-    private final SelectedEventsPanel selectedEventsPanel;
-
-    private final AjaxDropDownChoicePanel<EventCategoryType> type;
-
-    private final AjaxDropDownChoicePanel<String> category;
-
-    private final AjaxDropDownChoicePanel<String> subcategory;
-
-    private final AjaxTextFieldPanel custom;
-
-    private final ActionLinksPanel actionPanel;
-
-    private final IModel<List<String>> model;
-
-    public LoggerCategoryPanel(
-            final String id,
-            final List<EventCategoryTO> eventCategoryTOs,
-            final IModel<List<String>> model,
-            final PageReference pageReference,
-            final String pageId) {
-        super(id);
-
-        this.model = model;
-        selectedEventsPanel = new SelectedEventsPanel("selectedEventsPanel", model);
-        add(selectedEventsPanel);
-
-        this.eventCategoryTOs = eventCategoryTOs;
-
-        categoryContainer = new WebMarkupContainer("categoryContainer");
-        categoryContainer.setOutputMarkupId(true);
-        add(categoryContainer);
-
-        eventsContainer = new WebMarkupContainer("eventsContainer");
-        eventsContainer.setOutputMarkupId(true);
-        add(eventsContainer);
-
-        authorizeList();
-        authorizeChanges();
-
-        type = new AjaxDropDownChoicePanel<EventCategoryType>(
-                "type",
-                "type",
-                new PropertyModel<EventCategoryType>(eventCategoryTO, "type"),
-                false);
-        type.setChoices(Arrays.asList(EventCategoryType.values()));
-        type.setStyleSheet("ui-widget-content ui-corner-all");
-        type.setChoiceRenderer(new IChoiceRenderer<EventCategoryType>() {
-
-            private static final long serialVersionUID = 2317134950949778735L;
-
-            @Override
-            public String getDisplayValue(final EventCategoryType eventCategoryType) {
-                return eventCategoryType.name();
-            }
-
-            @Override
-            public String getIdValue(final EventCategoryType eventCategoryType, final int i) {
-                return eventCategoryType.name();
-            }
-
-            @Override
-            public EventCategoryType getObject(
-                    final String id, final IModel<? extends List<? extends EventCategoryType>> choices) {
-                return IterableUtils.find(choices.getObject(), new Predicate<EventCategoryType>() {
-
-                    @Override
-                    public boolean evaluate(final EventCategoryType object) {
-                        return object.name().equals(id);
-                    }
-                });
-            }
-        });
-        categoryContainer.add(type);
-
-        type.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306810L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                send(LoggerCategoryPanel.this, Broadcast.EXACT, new ChangeCategoryEvent(target, type));
-            }
-        });
-
-        category = new AjaxDropDownChoicePanel<String>(
-                "category",
-                "category",
-                new PropertyModel<String>(eventCategoryTO, "category"),
-                false);
-        category.setChoices(filter(eventCategoryTOs, type.getModelObject()));
-//        category.setStyleSheet("ui-widget-content ui-corner-all");
-        categoryContainer.add(category);
-
-        category.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306811L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                send(LoggerCategoryPanel.this, Broadcast.EXACT, new ChangeCategoryEvent(target, category));
-            }
-        });
-
-        subcategory = new AjaxDropDownChoicePanel<String>(
-                "subcategory",
-                "subcategory",
-                new PropertyModel<String>(eventCategoryTO, "subcategory"),
-                false);
-        subcategory.setChoices(filter(eventCategoryTOs, type.getModelObject(), category.getModelObject()));
-//        subcategory.setStyleSheet("ui-widget-content ui-corner-all");
-        categoryContainer.add(subcategory);
-
-        subcategory.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306812L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                send(LoggerCategoryPanel.this, Broadcast.EXACT, new ChangeCategoryEvent(target, subcategory));
-            }
-        });
-
-        categoryContainer.add(new Label("customLabel", new ResourceModel("custom", "custom")).setVisible(false));
-
-        custom = new AjaxTextFieldPanel("custom", "custom", new Model<String>(null));
-//        custom.setStyleSheet("ui-widget-content ui-corner-all short_fixedsize");
-        custom.setVisible(false);
-        custom.setEnabled(false);
-
-        categoryContainer.add(custom.hideLabel());
-
-        actionPanel = ActionLinksPanel.<EventCategoryTO>builder().
-                add(new ActionLink<EventCategoryTO>() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
-
-                        if (StringUtils.isNotBlank(custom.getModelObject())) {
-                            final Map.Entry<EventCategoryTO, AuditElements.Result> parsed = AuditLoggerName.
-                                    parseEventCategory(
-                                            custom.getModelObject());
-
-                            final String eventString = AuditLoggerName.buildEvent(
-                                    parsed.getKey().getType(),
-                                    null,
-                                    null,
-                                    parsed.getKey().getEvents().isEmpty()
-                                            ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
-                                    parsed.getValue());
-
-                            custom.setModelObject(StringUtils.EMPTY);
-                            send(LoggerCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
-                                    target,
-                                    Collections.<String>singleton(eventString),
-                                    Collections.<String>emptySet()));
-                            target.add(categoryContainer);
-                        }
-                    }
-                }, ActionLink.ActionType.CREATE, StandardEntitlement.NOTIFICATION_UPDATE, true).
-                add(new ActionLink<EventCategoryTO>() {
-
-                    private static final long serialVersionUID = -3722207913631435501L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
-                        if (StringUtils.isNotBlank(custom.getModelObject())) {
-                            final Map.Entry<EventCategoryTO, AuditElements.Result> parsed = AuditLoggerName.
-                                    parseEventCategory(
-                                            custom.getModelObject());
-
-                            final String eventString = AuditLoggerName.buildEvent(
-                                    parsed.getKey().getType(),
-                                    null,
-                                    null,
-                                    parsed.getKey().getEvents().isEmpty()
-                                            ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
-                                    parsed.getValue());
-
-                            custom.setModelObject(StringUtils.EMPTY);
-                            send(LoggerCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
-                                    target,
-                                    Collections.<String>singleton(eventString),
-                                    Collections.<String>emptySet()));
-                            target.add(categoryContainer);
-                        }
-                    }
-                }, ActionLink.ActionType.CREATE, pageId, true).
-                add(new ActionLink<EventCategoryTO>() {
-
-                    private static final long serialVersionUID = -3722207913631435521L;
-
-                    @Override
-                    public void onClick(final AjaxRequestTarget target, final EventCategoryTO modelObject) {
-                        if (StringUtils.isNotBlank(custom.getModelObject())) {
-                            final Map.Entry<EventCategoryTO, AuditElements.Result> parsed = AuditLoggerName.
-                                    parseEventCategory(
-                                            custom.getModelObject());
-
-                            final String eventString = AuditLoggerName.buildEvent(
-                                    parsed.getKey().getType(),
-                                    null,
-                                    null,
-                                    parsed.getKey().getEvents().isEmpty()
-                                            ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
-                                    parsed.getValue());
-
-                            custom.setModelObject(StringUtils.EMPTY);
-                            send(LoggerCategoryPanel.this.getPage(), Broadcast.BREADTH, new EventSelectionChanged(
-                                    target,
-                                    Collections.<String>emptySet(),
-                                    Collections.<String>singleton(eventString)));
-                            target.add(categoryContainer);
-                        }
-                    }
-                }, ActionLink.ActionType.DELETE, pageId, true).build("customActions");
-
-        //, new Model(), pageReference);
-        categoryContainer.add(actionPanel);
-
-        actionPanel.setVisible(false);
-        actionPanel.setEnabled(false);
-
-        eventsContainer.add(new EventSelectionPanel("eventsPanel", eventCategoryTO, model) {
-
-            private static final long serialVersionUID = 3513194801190026082L;
-
-            @Override
-            protected void onEventAction(final IEvent<?> event) {
-                LoggerCategoryPanel.this.onEventAction(event);
-            }
-        });
-    }
-
-    private List<String> filter(
-            final List<EventCategoryTO> eventCategoryTOs, final EventCategoryType type) {
-        final Set<String> res = new HashSet<String>();
-
-        for (EventCategoryTO eventCategory : eventCategoryTOs) {
-            if (type == eventCategory.getType() && StringUtils.isNotEmpty(eventCategory.getCategory())) {
-                res.add(eventCategory.getCategory());
-            }
-        }
-
-        final List<String> filtered = new ArrayList<String>(res);
-        Collections.sort(filtered);
-        return filtered;
-    }
-
-    private List<String> filter(
-            final List<EventCategoryTO> eventCategoryTOs, final EventCategoryType type, final String category) {
-        final Set<String> res = new HashSet<String>();
-
-        for (EventCategoryTO eventCategory : eventCategoryTOs) {
-            if (type == eventCategory.getType() && StringUtils.equals(category, eventCategory.getCategory())
-                    && StringUtils.isNotEmpty(eventCategory.getSubcategory())) {
-                res.add(eventCategory.getSubcategory());
-            }
-        }
-
-        final List<String> filtered = new ArrayList<String>(res);
-        Collections.sort(filtered);
-        return filtered;
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void onEvent(final IEvent<?> event) {
-        if (event.getPayload() instanceof ChangeCategoryEvent) {
-            // update objects ....
-            eventCategoryTO.getEvents().clear();
-
-            final ChangeCategoryEvent change = (ChangeCategoryEvent) event.getPayload();
-
-            final Panel changedPanel = change.getChangedPanel();
-            if ("type".equals(changedPanel.getId())) {
-                eventCategoryTO.setType(type.getModelObject());
-                eventCategoryTO.setCategory(null);
-                eventCategoryTO.setSubcategory(null);
-
-                if (type.getModelObject() == EventCategoryType.CUSTOM) {
-                    category.setChoices(Collections.<String>emptyList());
-                    subcategory.setChoices(Collections.<String>emptyList());
-                    category.setEnabled(false);
-                    subcategory.setEnabled(false);
-                    custom.setVisible(true);
-                    custom.setEnabled(true);
-                    actionPanel.setVisible(true);
-                    actionPanel.setEnabled(true);
-
-                } else {
-                    category.setChoices(filter(eventCategoryTOs, type.getModelObject()));
-                    subcategory.setChoices(Collections.<String>emptyList());
-                    category.setEnabled(true);
-                    subcategory.setEnabled(true);
-                    custom.setVisible(false);
-                    custom.setEnabled(false);
-                    actionPanel.setVisible(false);
-                    actionPanel.setEnabled(false);
-                }
-                change.getTarget().add(categoryContainer);
-            } else if ("category".equals(changedPanel.getId())) {
-                subcategory.setChoices(filter(eventCategoryTOs, type.getModelObject(), category.getModelObject()));
-                eventCategoryTO.setCategory(category.getModelObject());
-                eventCategoryTO.setSubcategory(null);
-                change.getTarget().add(categoryContainer);
-            } else {
-                eventCategoryTO.setSubcategory(subcategory.getModelObject());
-            }
-
-            updateEventsContainer(change.getTarget());
-        } else if (event.getPayload() instanceof InspectSelectedEvent) {
-            // update objects ....
-            eventCategoryTO.getEvents().clear();
-
-            final InspectSelectedEvent inspectSelectedEvent = (InspectSelectedEvent) event.getPayload();
-
-            final Map.Entry<EventCategoryTO, AuditElements.Result> categoryEvent = AuditLoggerName.parseEventCategory(
-                    inspectSelectedEvent.getEvent());
-
-            eventCategoryTO.setType(categoryEvent.getKey().getType());
-            category.setChoices(filter(eventCategoryTOs, type.getModelObject()));
-
-            eventCategoryTO.setCategory(categoryEvent.getKey().getCategory());
-            subcategory.setChoices(filter(eventCategoryTOs, type.getModelObject(), category.getModelObject()));
-
-            eventCategoryTO.setSubcategory(categoryEvent.getKey().getSubcategory());
-
-            if (categoryEvent.getKey().getType() == EventCategoryType.CUSTOM) {
-                custom.setModelObject(AuditLoggerName.buildEvent(
-                        categoryEvent.getKey().getType(),
-                        categoryEvent.getKey().getCategory(),
-                        categoryEvent.getKey().getSubcategory(),
-                        categoryEvent.getKey().getEvents().isEmpty()
-                                ? StringUtils.EMPTY : categoryEvent.getKey().getEvents().iterator().next(),
-                        categoryEvent.getValue()));
-
-                category.setEnabled(false);
-                subcategory.setEnabled(false);
-                custom.setVisible(true);
-                custom.setEnabled(true);
-                actionPanel.setVisible(true);
-                actionPanel.setEnabled(true);
-            } else {
-                category.setEnabled(true);
-                subcategory.setEnabled(true);
-                custom.setVisible(false);
-                custom.setEnabled(false);
-                actionPanel.setVisible(false);
-                actionPanel.setEnabled(false);
-            }
-
-            inspectSelectedEvent.getTarget().add(categoryContainer);
-            updateEventsContainer(inspectSelectedEvent.getTarget());
-        }
-    }
-
-    private void setEvents() {
-        final Iterator<EventCategoryTO> itor = eventCategoryTOs.iterator();
-        while (itor.hasNext() && eventCategoryTO.getEvents().isEmpty()) {
-            final EventCategoryTO eventCategory = itor.next();
-            if (eventCategory.getType() == eventCategoryTO.getType()
-                    && StringUtils.equals(eventCategory.getCategory(), eventCategoryTO.getCategory())
-                    && StringUtils.equals(eventCategory.getSubcategory(), eventCategoryTO.getSubcategory())) {
-                eventCategoryTO.getEvents().addAll(eventCategory.getEvents());
-
-            }
-        }
-    }
-
-    private class ChangeCategoryEvent {
-
-        private final AjaxRequestTarget target;
-
-        private final Panel changedPanel;
-
-        ChangeCategoryEvent(final AjaxRequestTarget target, final Panel changedPanel) {
-            this.target = target;
-            this.changedPanel = changedPanel;
-        }
-
-        public AjaxRequestTarget getTarget() {
-            return target;
-        }
-
-        public Panel getChangedPanel() {
-            return changedPanel;
-        }
-    }
-
-    /**
-     * To be extended in order to add actions on events.
-     *
-     * @param event event.
-     */
-    protected void onEventAction(final IEvent<?> event) {
-        // nothing by default
-    }
-
-    private void authorizeList() {
-        for (String role : getListRoles()) {
-            MetaDataRoleAuthorizationStrategy.authorize(selectedEventsPanel, RENDER, role);
-        }
-    }
-
-    private void authorizeChanges() {
-        for (String role : getChangeRoles()) {
-            MetaDataRoleAuthorizationStrategy.authorize(categoryContainer, RENDER, role);
-            MetaDataRoleAuthorizationStrategy.authorize(eventsContainer, RENDER, role);
-        }
-    }
-
-    private void updateEventsContainer(final AjaxRequestTarget target) {
-        setEvents();
-
-        eventsContainer.addOrReplace(new EventSelectionPanel("eventsPanel", eventCategoryTO, model) {
-
-            private static final long serialVersionUID = 3513194801190026082L;
-
-            @Override
-            public void onEventAction(final IEvent<?> event) {
-                LoggerCategoryPanel.this.onEventAction(event);
-            }
-        });
-        target.add(eventsContainer);
-    }
-
-    protected abstract String[] getListRoles();
-
-    protected abstract String[] getChangeRoles();
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/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 2b9d072..6b1796f 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
@@ -203,14 +203,14 @@ public class MailTemplateDirectoryPanel
 
         @Override
         public Iterator<MailTemplateTO> iterator(final long first, final long count) {
-            final List<MailTemplateTO> list = restClient.getAllAvailableTemplates();
+            final List<MailTemplateTO> list = restClient.listTemplates();
             Collections.sort(list, comparator);
             return list.subList((int) first, (int) first + (int) count).iterator();
         }
 
         @Override
         public long size() {
-            return restClient.getAllAvailableTemplates().size();
+            return restClient.listTemplates().size();
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/052cf6b1/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
index 195c5ff..ba0e43a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
@@ -34,6 +34,7 @@ import org.apache.syncope.client.console.notifications.NotificationDirectoryPane
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 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.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CollectionPropertyColumn;
 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;
@@ -56,23 +57,24 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public class NotificationDirectoryPanel
-        extends DirectoryPanel<NotificationTO, NotificationHandler, NotificationProvider, NotificationRestClient> {
+        extends DirectoryPanel<NotificationTO, NotificationWrapper, NotificationProvider, NotificationRestClient> {
 
     private static final long serialVersionUID = -3789392431954221446L;
 
     protected final BaseModal<Serializable> utilityModal = new BaseModal<>("outer");
 
-    public NotificationDirectoryPanel(final String id, final PageReference pageReference) {
-        super(id, pageReference, true);
+    public NotificationDirectoryPanel(final String id, final PageReference pageRef) {
+        super(id, pageRef, true);
         disableCheckBoxes();
 
         addOuterObject(utilityModal);
         setWindowClosedReloadCallback(utilityModal);
+        utilityModal.size(Modal.Size.Large);
 
         modal.size(Modal.Size.Large);
         altDefaultModal.size(Modal.Size.Large);
 
-        addNewItemPanelBuilder(new NotificationWizardBuilder(new NotificationTO(), pageReference), true);
+        addNewItemPanelBuilder(new NotificationWizardBuilder(new NotificationTO(), pageRef), true);
 
         restClient = new NotificationRestClient();
 
@@ -83,7 +85,6 @@ public class NotificationDirectoryPanel
 
     @Override
     protected List<IColumn<NotificationTO, String>> getColumns() {
-
         List<IColumn<NotificationTO, String>> columns = new ArrayList<>();
         columns.add(new KeyPropertyColumn<NotificationTO>(
                 new StringResourceModel("key", this, null), "key", "key"));
@@ -95,7 +96,7 @@ public class NotificationDirectoryPanel
                 new StringResourceModel("template", this, null), "template", "template"));
         columns.add(new PropertyColumn<NotificationTO, String>(
                 new StringResourceModel("traceLevel", this, null), "traceLevel", "traceLevel"));
-        columns.add(new PropertyColumn<NotificationTO, String>(
+        columns.add(new BooleanPropertyColumn<NotificationTO>(
                 new StringResourceModel("active", this, null), "active", "active"));
 
         columns.add(new ActionColumn<NotificationTO, String>(new ResourceModel("actions", "")) {
@@ -130,7 +131,7 @@ public class NotificationDirectoryPanel
                     public void onClick(final AjaxRequestTarget target, final NotificationTO ignore) {
                         send(NotificationDirectoryPanel.this, Broadcast.EXACT,
                                 new AjaxWizard.EditItemActionEvent<>(
-                                        new NotificationHandler(restClient.read(model.getObject().getKey())), target));
+                                        new NotificationWrapper(restClient.read(model.getObject().getKey())), target));
                     }
                 }, ActionLink.ActionType.EDIT, StandardEntitlement.NOTIFICATION_UPDATE);
 
@@ -173,7 +174,7 @@ public class NotificationDirectoryPanel
         return Collections.<ActionLink.ActionType>emptyList();
     }
 
-    public class NotificationProvider extends DirectoryDataProvider<NotificationTO> {
+    protected class NotificationProvider extends DirectoryDataProvider<NotificationTO> {
 
         private static final long serialVersionUID = -276043813563988590L;
 
@@ -181,20 +182,21 @@ public class NotificationDirectoryPanel
 
         public NotificationProvider(final int paginatorRows) {
             super(paginatorRows);
+
             setSort("key", SortOrder.ASCENDING);
             comparator = new SortableDataProviderComparator<>(this);
         }
 
         @Override
         public Iterator<NotificationTO> iterator(final long first, final long count) {
-            final List<NotificationTO> list = restClient.getAllNotifications();
+            List<NotificationTO> list = restClient.list();
             Collections.sort(list, comparator);
             return list.subList((int) first, (int) first + (int) count).iterator();
         }
 
         @Override
         public long size() {
-            return restClient.getAllNotifications().size();
+            return restClient.list().size();
         }
 
         @Override