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

[1/2] syncope git commit: [SYNCOPE-818] provides mapping item tranformers widget

Repository: syncope
Updated Branches:
  refs/heads/master b0417d7c3 -> 32726184d


http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties
index 80dd08f..bf1188f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_ru.properties
@@ -36,6 +36,7 @@ entity=\u041e\u0431\u044a\u0435\u043a\u0442
 groupSchema=\u0410\u0442\u0440\u0438\u0431\u0443\u0442 \u0433\u0440\u0443\u043f\u043f\u044b
 # connObjectKey=\u00d0\u009a\u00d0\u00bb\u00d1\u008e\u00d1\u0087\u00d0\u00b5\u00d0\u00b2\u00d0\u00be\u00d0\u00b9 \u00d0\u00b0\u00d1\u0082\u00d1\u0080\u00d0\u00b8\u00d0\u00b1\u00d1\u0083\u00d1\u0082 \u00d1\u0080\u00d0\u00b5\u00d1\u0081\u00d1\u0083\u00d1\u0080\u00d1\u0081\u00d0\u00b0
 connObjectKey=\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u0430
+transformers=Item Transformers
 # mandatoryCondition=\u00d0\u009e\u00d0\u00b1\u00d1\u008f\u00d0\u00b7\u00d0\u00b0\u00d1\u0082\u00d0\u00b5\u00d0\u00bb\u00d1\u008c\u00d0\u00bd\u00d1\u008b\u00d0\u00b9
 mandatoryCondition=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439
 # password=\u00d0\u009f\u00d0\u00b0\u00d1\u0080\u00d0\u00be\u00d0\u00bb\u00d1\u008c

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
index 1a3a410..45375d6 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/TopologyITCase.java
@@ -21,6 +21,7 @@ package org.apache.syncope.fit.console;
 import static org.junit.Assert.assertNotNull;
 
 import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.wicket.markup.html.form.NonI18nPalette;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -88,6 +89,17 @@ public class TopologyITCase extends AbstractConsoleITCase {
 
         wicketTester.assertComponent("body:toggle:outerObjectsRepeater:2:outer:form:content:provision:"
                 + "container:content:wizard:form:view:mapping:mappingContainer:mappings:1", WebMarkupContainer.class);
+        
+        wicketTester.executeAjaxEvent("body:toggle:outerObjectsRepeater:2:outer:form:content:provision:"
+                + "container:content:wizard:form:view:mapping:mappingContainer:mappings:1:transformers:icon", 
+                Constants.ON_CLICK);
+        
+        wicketTester.clickLink("body:toggle:outerObjectsRepeater:2:outer:form:content:provision:container:content:"
+                + "wizard:form:view:mapping:mappingContainer:mappings:0:transformers:alertsLink");
+        
+        wicketTester.assertComponent("body:toggle:outerObjectsRepeater:2:outer:form:content:provision:container:"
+                + "content:wizard:form:view:mapping:transformersTogglePanel:container:content:togglePanelContainer:"
+                + "form:classes:paletteField", NonI18nPalette.class);
     }
 
     @Test


[2/2] syncope git commit: [SYNCOPE-818] provides mapping item tranformers widget

Posted by fm...@apache.org.
[SYNCOPE-818] provides mapping item tranformers widget


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

Branch: refs/heads/master
Commit: 32726184d30cf3f9dfd4a41152b7bb9658043ea2
Parents: b0417d7
Author: fmartelli <fa...@gmail.com>
Authored: Wed Apr 27 15:24:56 2016 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Wed Apr 27 15:24:56 2016 +0200

----------------------------------------------------------------------
 .../client/console/commons/Constants.java       |  18 +-
 .../client/console/panels/TogglePanel.java      |   1 +
 .../console/tasks/TransformersTogglePanel.java  | 122 +++++++++++
 .../client/console/widgets/AlertWidget.java     | 143 ++++++++++++
 .../client/console/widgets/ApprovalsWidget.java | 219 ++++++++-----------
 .../widgets/MappingItemTransformerWidget.java   |  82 +++++++
 .../resources/ProvisionWizardBuilder.java       |   2 -
 .../wizards/resources/ResourceMappingPanel.java |  14 ++
 .../META-INF/resources/css/syncopeConsole.css   |  97 +++++++-
 .../console/tasks/TransformersTogglePanel.html  |  35 +++
 .../tasks/TransformersTogglePanel.properties    |  19 ++
 .../tasks/TransformersTogglePanel_it.properties |  19 ++
 .../TransformersTogglePanel_pt_BR.properties    |  19 ++
 .../tasks/TransformersTogglePanel_ru.properties |  19 ++
 .../console/widgets/AlertWidget$AlertLink.html  |  23 ++
 .../client/console/widgets/AlertWidget.html     |  41 ++++
 .../console/widgets/AlertWidget.properties      |  18 ++
 .../console/widgets/AlertWidget_it.properties   |  18 ++
 .../widgets/AlertWidget_pt_BR.properties        |  18 ++
 .../console/widgets/AlertWidget_ru.properties   |  21 ++
 .../widgets/ApprovalsWidget$InnerPanel.html     |  27 +++
 .../client/console/widgets/ApprovalsWidget.html |  45 ----
 .../console/widgets/ApprovalsWidget.properties  |   2 +-
 .../widgets/ApprovalsWidget_it.properties       |   2 +-
 .../widgets/ApprovalsWidget_pt_BR.properties    |   2 +-
 .../widgets/ApprovalsWidget_ru.properties       |  12 +-
 .../MappingItemTransformerWidget.properties     |  18 ++
 .../MappingItemTransformerWidget_it.properties  |  18 ++
 ...appingItemTransformerWidget_pt_BR.properties |  18 ++
 .../MappingItemTransformerWidget_ru.properties  |  21 ++
 .../wizards/resources/ResourceMappingPanel.html | 140 ++++++------
 .../resources/ResourceProvisionPanel.properties |   1 +
 .../ResourceProvisionPanel_it.properties        |   1 +
 .../ResourceProvisionPanel_pt_BR.properties     |   1 +
 .../ResourceProvisionPanel_ru.properties        |   1 +
 .../syncope/fit/console/TopologyITCase.java     |  12 +
 36 files changed, 1020 insertions(+), 249 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
index 96d4ba6..74f2ac9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/Constants.java
@@ -23,6 +23,7 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.components.PopoverConfig
 import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
 import org.apache.wicket.Component;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
 public final class Constants {
@@ -155,9 +156,19 @@ public final class Constants {
      */
     public static final String GUARDED_BYTE_ARRAY = "org.identityconnectors.common.security.GuardedByteArray";
 
-    public static Component getJEXLPopover(final Component caller, final TooltipConfig.Placement placement) {
-        return new Label("jexlInfo", Model.of()).add(new PopoverBehavior(
+    public static Component getPopover(
+            final String id,
+            final IModel<String> msg,
+            final Component caller,
+            final TooltipConfig.Placement placement) {
+        return new Label(id, Model.of()).add(new PopoverBehavior(
                 Model.<String>of(),
+                msg,
+                new PopoverConfig().withHtml(true).withPlacement(placement)));
+    }
+
+    public static Component getJEXLPopover(final Component caller, final TooltipConfig.Placement placement) {
+        return getPopover("jexlInfo",
                 Model.of(caller.getString("jexl_info")
                         + "<ul>"
                         + "<li>" + caller.getString("jexl_ex1") + "</li>"
@@ -165,7 +176,8 @@ public final class Constants {
                         + "</ul>"
                         + "<a href='https://commons.apache.org/proper/commons-jexl/reference/index.html' "
                         + "target='_blank'>" + caller.getString("jexl_syntax_url") + "</a>"),
-                new PopoverConfig().withHtml(true).withPlacement(placement)));
+                caller,
+                placement);
     }
 
     private Constants() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java
index 84a4745..18fd380 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/TogglePanel.java
@@ -119,6 +119,7 @@ public abstract class TogglePanel<T extends Serializable> extends WizardMgtPanel
         final String selector = String.format("$(\"div#%s\")", getId());
         if (toggle) {
             if (status == Status.INACTIVE) {
+                target.add(TogglePanel.this.container);
                 target.appendJavaScript(
                         selector + ".toggle(\"slow\");"
                         + selector + ".attr(\"class\", \"topology-menu active-topology-menu\");");

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/java/org/apache/syncope/client/console/tasks/TransformersTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/TransformersTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TransformersTogglePanel.java
new file mode 100644
index 0000000..7b68996
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/TransformersTogglePanel.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.tasks;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.panels.TogglePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
+import org.apache.syncope.common.lib.to.MappingItemTO;
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.IChoiceRenderer;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.util.ListModel;
+
+public class TransformersTogglePanel extends TogglePanel<Serializable> {
+
+    private static final long serialVersionUID = -3195479265440591519L;
+
+    private Component container;
+
+    private MappingItemTO mapItem;
+
+    public TransformersTogglePanel(final WebMarkupContainer container) {
+        super("transformersTogglePanel");
+        this.container = container;
+
+        final LoadableDetachableModel<List<String>> model = new LoadableDetachableModel<List<String>>() {
+
+            private static final long serialVersionUID = 5275935387613157437L;
+
+            @Override
+            protected List<String> load() {
+                // [!] this is required to disable changed with close button
+                return mapItem == null
+                        ? Collections.<String>emptyList()
+                        : new ArrayList<>(mapItem.getMappingItemTransformerClassNames());
+            }
+        };
+
+        final Form<?> form = new Form<>("form");
+        addInnerObject(form);
+
+        form.add(new AjaxPalettePanel.Builder<String>().setAllowOrder(true).setRenderer(new IChoiceRenderer<String>() {
+
+            private static final long serialVersionUID = 3464376099975468136L;
+
+            private static final int MAX_LENGTH = 50;
+
+            @Override
+            public Object getDisplayValue(final String object) {
+                if (object.length() > MAX_LENGTH) {
+                    return "..." + object.substring(object.length() - MAX_LENGTH);
+                } else {
+                    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;
+            }
+        }).build(
+                "classes",
+                model,
+                new ListModel<>(
+                        new ArrayList<>(SyncopeConsoleSession.get().getPlatformInfo().getMappingItemTransformers()))).
+                hideLabel().setEnabled(true).setOutputMarkupId(true));
+
+        form.add(new AjaxSubmitLink("submit", form) {
+
+            private static final long serialVersionUID = 5538299138211283825L;
+
+            @Override
+            public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+                toggle(target, false);
+
+                // [!] this is required to disable changed with close button
+                mapItem.getMappingItemTransformerClassNames().clear();
+                mapItem.getMappingItemTransformerClassNames().addAll(model.getObject());
+
+                target.add(TransformersTogglePanel.this.container);
+            }
+
+        });
+    }
+
+    public TransformersTogglePanel setMappingItem(final AjaxRequestTarget target, final MappingItemTO mapItem) {
+        this.mapItem = mapItem;
+        setHeader(target, StringUtils.EMPTY);
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/java/org/apache/syncope/client/console/widgets/AlertWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/AlertWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/AlertWidget.java
new file mode 100644
index 0000000..d3371cd
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/AlertWidget.java
@@ -0,0 +1,143 @@
+/*
+ * 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.widgets;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.image.Icon;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesomeIconTypeBuilder;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesomeIconTypeBuilder.FontAwesomeGraphic;
+import java.io.Serializable;
+import java.util.List;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.AbstractLink;
+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.LoadableDetachableModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AlertWidget<T extends Serializable> extends Panel {
+
+    private static final long serialVersionUID = 7667120094526529934L;
+
+    protected static final Logger LOG = LoggerFactory.getLogger(AlertWidget.class);
+
+    protected final Label linkAlertsNumber;
+
+    protected final Label headerAlertsNumber;
+
+    protected final WebMarkupContainer latestAlertsList;
+
+    protected final ListView<T> latestFive;
+
+    protected IModel<List<T>> latestAlerts;
+
+    public AlertWidget(final String id) {
+        super(id);
+        this.latestAlerts = getLatestAlerts();
+
+        setOutputMarkupId(true);
+
+        final LoadableDetachableModel<Integer> size = new LoadableDetachableModel<Integer>() {
+
+            private static final long serialVersionUID = 7474274077691068779L;
+
+            @Override
+            protected Integer load() {
+                return AlertWidget.this.latestAlerts.getObject().size();
+            }
+        };
+
+        final LoadableDetachableModel<List<T>> items = new LoadableDetachableModel<List<T>>() {
+
+            private static final long serialVersionUID = 7474274077691068779L;
+
+            @Override
+            protected List<T> load() {
+                final List<T> latest = AlertWidget.this.latestAlerts.getObject();
+                return latest.subList(0, latest.size() < 6 ? latest.size() : 5);
+            }
+        };
+
+        add(getIcon("icon"));
+
+        linkAlertsNumber = new Label("alerts", size) {
+
+            private static final long serialVersionUID = 4755868673082976208L;
+
+            @Override
+            protected void onComponentTag(final ComponentTag tag) {
+                super.onComponentTag(tag);
+                if (Integer.valueOf(getDefaultModelObject().toString()) > 0) {
+                    tag.put("class", "label label-danger");
+                } else {
+                    tag.put("class", "label label-info");
+                }
+            }
+        };
+        add(linkAlertsNumber.setOutputMarkupId(true));
+
+        headerAlertsNumber = new Label("number", size);
+        headerAlertsNumber.setOutputMarkupId(true);
+        add(headerAlertsNumber);
+
+        latestAlertsList = new WebMarkupContainer("latestAlertsList");
+        latestAlertsList.setOutputMarkupId(true);
+        add(latestAlertsList);
+
+        latestFive = new ListView<T>("latestAlerts", items) {
+
+            private static final long serialVersionUID = 4949588177564901031L;
+
+            @Override
+            protected void populateItem(final ListItem<T> item) {
+                item.add(getAlertLink("alert", item.getModelObject()).setRenderBodyOnly(true));
+            }
+        };
+        latestAlertsList.add(latestFive.setReuseItems(false).setOutputMarkupId(true));
+
+        add(getEventsLink("alertsLink"));
+    }
+
+    protected abstract IModel<List<T>> getLatestAlerts();
+
+    protected Panel getAlertLink(final String panelid, final T alert) {
+        return new AlertLink<T>(panelid, alert);
+    }
+
+    protected abstract AbstractLink getEventsLink(final String linkid);
+
+    protected Icon getIcon(final String iconid) {
+        return new Icon(iconid, FontAwesomeIconTypeBuilder.on(FontAwesomeGraphic.flag_o).build());
+    }
+
+    public static class AlertLink<T> extends Panel {
+
+        private static final long serialVersionUID = -6011939604125512766L;
+
+        public AlertLink(final String id, final T alert) {
+            super(id);
+            add(new Label("alert", alert.toString()));
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java
index 7a50226..0f98327 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ApprovalsWidget.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.pages.Approvals;
@@ -39,169 +40,130 @@ import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-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.LoadableDetachableModel;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.util.ListModel;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
 import org.apache.wicket.protocol.ws.api.WebSocketPushBroadcaster;
 import org.apache.wicket.protocol.ws.api.event.WebSocketPushPayload;
 import org.apache.wicket.protocol.ws.api.message.ConnectedMessage;
 import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage;
 import org.apache.wicket.protocol.ws.api.registry.IKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class ApprovalsWidget extends Panel {
+public class ApprovalsWidget extends AlertWidget<WorkflowFormTO> {
 
     private static final long serialVersionUID = 7667120094526529934L;
 
-    private static final Logger LOG = LoggerFactory.getLogger(ApprovalsWidget.class);
-
-    private static List<WorkflowFormTO> getLastApprovals() {
-        if (SyncopeConsoleSession.get().owns(StandardEntitlement.WORKFLOW_FORM_LIST)) {
-            return SyncopeConsoleSession.get().getService(UserWorkflowService.class).getForms();
-        } else {
-            return Collections.<WorkflowFormTO>emptyList();
-        }
-    }
-
-    private final Label linkApprovalsNumber;
-
-    private final Label headerApprovalsNumber;
-
-    private final WebMarkupContainer lastApprovalsList;
-
-    private final ListView<WorkflowFormTO> lastFive;
-
-    private final List<WorkflowFormTO> lastApprovals;
-
     public ApprovalsWidget(final String id, final PageReference pageRef) {
         super(id);
         setOutputMarkupId(true);
+    }
 
-        LoadableDetachableModel<List<WorkflowFormTO>> model = new LoadableDetachableModel<List<WorkflowFormTO>>() {
-
-            private static final long serialVersionUID = 7474274077691068779L;
-
-            @Override
-            protected List<WorkflowFormTO> load() {
-                return ApprovalsWidget.this.lastApprovals.subList(0, ApprovalsWidget.this.lastApprovals.size() < 6
-                        ? ApprovalsWidget.this.lastApprovals.size() : 5);
+    @Override
+    public void onEvent(final IEvent<?> event) {
+        if (event.getPayload() instanceof WebSocketPushPayload) {
+            WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload();
+            if (wsEvent.getMessage() instanceof ApprovalsWidgetMessage) {
+                List<WorkflowFormTO> updatedApprovals = ((ApprovalsWidgetMessage) wsEvent.getMessage()).
+                        getUpdatedApprovals();
+                if (!latestAlerts.equals(updatedApprovals)) {
+                    latestAlerts.getObject().clear();
+                    latestAlerts.getObject().addAll(updatedApprovals);
+
+                    ApprovalsWidget.this.linkAlertsNumber.
+                            setDefaultModelObject(ApprovalsWidget.this.latestAlerts.getObject().size());
+                    wsEvent.getHandler().add(ApprovalsWidget.this.linkAlertsNumber);
+
+                    ApprovalsWidget.this.headerAlertsNumber.
+                            setDefaultModelObject(ApprovalsWidget.this.latestAlerts.getObject().size());
+                    wsEvent.getHandler().add(ApprovalsWidget.this.headerAlertsNumber);
+
+                    ApprovalsWidget.this.latestFive.removeAll();
+                    wsEvent.getHandler().add(ApprovalsWidget.this.latestAlertsList);
+                }
             }
-        };
+        }
+    }
 
-        lastApprovals = getLastApprovals();
-        Collections.sort(lastApprovals, new WorkflowFormComparator());
+    @Override
+    protected IModel<List<WorkflowFormTO>> getLatestAlerts() {
 
-        linkApprovalsNumber = new Label("approvals", lastApprovals.size()) {
+        return new ListModel<WorkflowFormTO>() {
 
-            private static final long serialVersionUID = 4755868673082976208L;
+            private static final long serialVersionUID = -2583290457773357445L;
 
             @Override
-            protected void onComponentTag(final ComponentTag tag) {
-                super.onComponentTag(tag);
-                if (Integer.valueOf(getDefaultModelObject().toString()) > 0) {
-                    tag.put("class", "label label-danger");
-                } else {
-                    tag.put("class", "label label-info");
-                }
+            public List<WorkflowFormTO> getObject() {
+                return ApprovalInfoUpdater.getLatestAlerts();
             }
-
         };
-        add(linkApprovalsNumber.setOutputMarkupId(true));
+    }
 
-        headerApprovalsNumber = new Label("number", lastApprovals.size());
-        headerApprovalsNumber.setOutputMarkupId(true);
-        add(headerApprovalsNumber);
+    @Override
+    protected Panel getAlertLink(final String panelid, final WorkflowFormTO event) {
+        return new ApprovalsWidget.InnerPanel(panelid, event);
+    }
 
-        lastApprovalsList = new WebMarkupContainer("lastApprovalsList");
-        lastApprovalsList.setOutputMarkupId(true);
-        add(lastApprovalsList);
+    @Override
+    protected AbstractLink getEventsLink(final String linkid) {
+        BookmarkablePageLink<Object> approvals = BookmarkablePageLinkBuilder.build(linkid, Approvals.class);
+        MetaDataRoleAuthorizationStrategy.authorize(approvals, WebPage.ENABLE, StandardEntitlement.WORKFLOW_FORM_LIST);
+        return approvals;
+    }
 
-        lastFive = new ListView<WorkflowFormTO>("lastApprovals", model) {
+    public static final class InnerPanel extends Panel {
 
-            private static final long serialVersionUID = 4949588177564901031L;
+        private static final long serialVersionUID = 3829642687027801451L;
 
-            @Override
-            protected void populateItem(final ListItem<WorkflowFormTO> item) {
-                final WorkflowFormTO modelObject = item.getModelObject();
+        public InnerPanel(final String id, final WorkflowFormTO alert) {
+            super(id);
 
-                final AjaxLink<String> approval = new AjaxLink<String>("approval") {
+            final AjaxLink<String> approval = new AjaxLink<String>("approval") {
 
-                    private static final long serialVersionUID = 7021195294339489084L;
+                private static final long serialVersionUID = 7021195294339489084L;
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target) {
-                        // do nothing
-                    }
+                @Override
+                public void onClick(final AjaxRequestTarget target) {
+                    // do nothing
+                }
 
-                    @Override
-                    protected void onComponentTag(final ComponentTag tag) {
-                        super.onComponentTag(tag);
-                        tag.put("title", modelObject.getUsername());
+                @Override
+                protected void onComponentTag(final ComponentTag tag) {
+                    super.onComponentTag(tag);
+                    if (StringUtils.isNotBlank(alert.getUsername())) {
+                        tag.put("title", alert.getUsername().trim());
                     }
-                };
-
-                item.add(approval);
-
-                approval.add(new Label("key", new ResourceModel(modelObject.getKey(), modelObject.getKey())).
-                        setRenderBodyOnly(true));
+                }
+            };
 
-                approval.add(new Label("owner", modelObject.getOwner()));
+            add(approval);
 
-                approval.add(new Label("createTime",
-                        SyncopeConsoleSession.get().getDateFormat().format(modelObject.getCreateTime())).
-                        setRenderBodyOnly(true));
+            approval.add(new Label("key", new ResourceModel(alert.getKey(), alert.getKey())).
+                    setRenderBodyOnly(true));
 
-                WebMarkupContainer dueDateContainer = new WebMarkupContainer("dueDateContainer");
-                dueDateContainer.setOutputMarkupId(true);
-                approval.add(dueDateContainer);
-
-                if (modelObject.getDueDate() == null) {
-                    dueDateContainer.add(new Label("dueDate"));
-                    dueDateContainer.setVisible(false);
-                } else {
-                    dueDateContainer.add(new Label("dueDate",
-                            SyncopeConsoleSession.get().getDateFormat().format(modelObject.getDueDate())).
-                            setRenderBodyOnly(true));
-                }
+            approval.add(new Label("owner", alert.getOwner()));
 
-            }
-        };
-        lastApprovalsList.add(lastFive.setReuseItems(false).setOutputMarkupId(true));
+            approval.add(new Label("createTime",
+                    SyncopeConsoleSession.get().getDateFormat().format(alert.getCreateTime())).
+                    setRenderBodyOnly(true));
 
-        BookmarkablePageLink<Object> approvals = BookmarkablePageLinkBuilder.build("approvalsLink", Approvals.class);
-        add(approvals);
-        MetaDataRoleAuthorizationStrategy.authorize(approvals, WebPage.ENABLE, StandardEntitlement.WORKFLOW_FORM_LIST);
-    }
+            WebMarkupContainer dueDateContainer = new WebMarkupContainer("dueDateContainer");
+            dueDateContainer.setOutputMarkupId(true);
+            approval.add(dueDateContainer);
 
-    @Override
-    public void onEvent(final IEvent<?> event) {
-        if (event.getPayload() instanceof WebSocketPushPayload) {
-            WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload();
-            if (wsEvent.getMessage() instanceof ApprovalsWidgetMessage) {
-                List<WorkflowFormTO> updatedApprovals =
-                        ((ApprovalsWidgetMessage) wsEvent.getMessage()).getUpdatedApprovals();
-                if (!lastApprovals.equals(updatedApprovals)) {
-                    lastApprovals.clear();
-                    lastApprovals.addAll(updatedApprovals);
-
-                    ApprovalsWidget.this.linkApprovalsNumber.
-                            setDefaultModelObject(ApprovalsWidget.this.lastApprovals.size());
-                    wsEvent.getHandler().add(ApprovalsWidget.this.linkApprovalsNumber);
-
-                    ApprovalsWidget.this.headerApprovalsNumber.
-                            setDefaultModelObject(ApprovalsWidget.this.lastApprovals.size());
-                    wsEvent.getHandler().add(ApprovalsWidget.this.headerApprovalsNumber);
-
-                    ApprovalsWidget.this.lastFive.removeAll();
-                    wsEvent.getHandler().add(ApprovalsWidget.this.lastApprovalsList);
-                }
+            if (alert.getDueDate() == null) {
+                dueDateContainer.add(new Label("dueDate"));
+                dueDateContainer.setVisible(false);
+            } else {
+                dueDateContainer.add(new Label("dueDate",
+                        SyncopeConsoleSession.get().getDateFormat().format(alert.getDueDate())).
+                        setRenderBodyOnly(true));
             }
         }
+
     }
 
     public static final class ApprovalInfoUpdater implements Runnable {
@@ -224,12 +186,10 @@ public class ApprovalsWidget extends Panel {
                 ThreadContext.setApplication(application);
                 ThreadContext.setSession(session);
 
-                List<WorkflowFormTO> updatedApprovals = getLastApprovals();
-                Collections.sort(updatedApprovals, new WorkflowFormComparator());
+                List<WorkflowFormTO> updatedApprovals = getLatestAlerts();
 
                 WebSocketSettings settings = WebSocketSettings.Holder.get(application);
-                WebSocketPushBroadcaster broadcaster =
-                        new WebSocketPushBroadcaster(settings.getConnectionRegistry());
+                WebSocketPushBroadcaster broadcaster = new WebSocketPushBroadcaster(settings.getConnectionRegistry());
                 broadcaster.broadcast(
                         new ConnectedMessage(application, session.getId(), key),
                         new ApprovalsWidgetMessage(updatedApprovals));
@@ -239,6 +199,17 @@ public class ApprovalsWidget extends Panel {
                 ThreadContext.detach();
             }
         }
+
+        protected static List<WorkflowFormTO> getLatestAlerts() {
+            final List<WorkflowFormTO> updatedApprovals;
+            if (SyncopeConsoleSession.get().owns(StandardEntitlement.WORKFLOW_FORM_LIST)) {
+                updatedApprovals = SyncopeConsoleSession.get().getService(UserWorkflowService.class).getForms();
+            } else {
+                updatedApprovals = Collections.<WorkflowFormTO>emptyList();
+            }
+            Collections.sort(updatedApprovals, new WorkflowFormComparator());
+            return updatedApprovals;
+        }
     }
 
     private static class ApprovalsWidgetMessage implements IWebSocketPushMessage, Serializable {

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/java/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget.java
new file mode 100644
index 0000000..5923417
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget.java
@@ -0,0 +1,82 @@
+/*
+ * 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.widgets;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.image.Icon;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesomeIconTypeBuilder;
+import java.util.List;
+import org.apache.syncope.client.console.tasks.TransformersTogglePanel;
+import org.apache.syncope.common.lib.to.MappingItemTO;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.util.ListModel;
+
+public class MappingItemTransformerWidget extends AlertWidget<String> {
+
+    private static final long serialVersionUID = 7667120094526529934L;
+
+    private final MappingItemTO mapItem;
+
+    private final TransformersTogglePanel transformers;
+
+    public MappingItemTransformerWidget(
+            final String id,
+            final MappingItemTO mapItem,
+            final TransformersTogglePanel transformers) {
+        super(id);
+        this.mapItem = mapItem;
+        this.transformers = transformers;
+        setOutputMarkupId(true);
+    }
+
+    @Override
+    protected IModel<List<String>> getLatestAlerts() {
+        return new ListModel<String>() {
+
+            private static final long serialVersionUID = 1232998477036705088L;
+
+            @Override
+            public List<String> getObject() {
+                return mapItem.getMappingItemTransformerClassNames();
+            }
+        };
+    }
+
+    @Override
+    protected AbstractLink getEventsLink(final String linkid) {
+        return new AjaxLink<String>(linkid) {
+
+            private static final long serialVersionUID = -7978723352517770644L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                transformers.setMappingItem(target, MappingItemTransformerWidget.this.mapItem);
+                transformers.toggle(target, true);
+            }
+        };
+    }
+
+    @Override
+    protected Icon getIcon(final String iconid) {
+        return new Icon(
+                iconid, FontAwesomeIconTypeBuilder.on(FontAwesomeIconTypeBuilder.FontAwesomeGraphic.magic).build());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
index 6aafbfa..e8b4947 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
@@ -149,7 +149,6 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple
         AuxClasses(final ProvisionTO item) {
             setTitleModel(new ResourceModel("auxClasses.title"));
             setSummaryModel(new StringResourceModel("auxClasses.summary", this, new Model<>(item)));
-
             add(new ProvisionAuxClassesPanel("auxClasses", item));
         }
     }
@@ -164,7 +163,6 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple
         Mapping(final ProvisionTO item) {
             setTitleModel(new ResourceModel("mapping.title"));
             setSummaryModel(new StringResourceModel("mapping.summary", this, new Model<>(item)));
-
             add(new ResourceMappingPanel("mapping", resourceTO, item));
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
index 46f1b4d..5733f48 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
@@ -34,6 +34,7 @@ import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.rest.ConnectorRestClient;
+import org.apache.syncope.client.console.tasks.TransformersTogglePanel;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
@@ -41,6 +42,7 @@ import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPan
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MappingPurposePanel;
+import org.apache.syncope.client.console.widgets.MappingItemTransformerWidget;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
@@ -126,6 +128,8 @@ public class ResourceMappingPanel extends Panel {
      */
     private final WebMarkupContainer mappingContainer;
 
+    private final TransformersTogglePanel transformers;
+
     private MappingTO getMapping() {
         if (provisionTO.getMapping() == null) {
             provisionTO.setMapping(new MappingTO());
@@ -152,6 +156,9 @@ public class ResourceMappingPanel extends Panel {
         this.mappingContainer.setOutputMarkupId(true);
         add(this.mappingContainer);
 
+        transformers = new TransformersTogglePanel(this.mappingContainer);
+        add(this.transformers);
+
         if (resourceTO.getConnector() != null) {
             schemaNames = getSchemaNames(resourceTO.getConnector(), resourceTO.getConfOverride());
             setEnabled();
@@ -292,6 +299,13 @@ public class ResourceMappingPanel extends Panel {
                 // -------------------------------
 
                 //--------------------------------
+                // Mapping item transformer
+                // -------------------------------
+                item.add(new MappingItemTransformerWidget(
+                        "transformers", mapItem, transformers).setRenderBodyOnly(true));
+                // -------------------------------
+
+                //--------------------------------
                 // Mandatory
                 // -------------------------------
                 final AjaxTextFieldPanel mandatory = new AjaxTextFieldPanel(

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/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 851ba8e..a8a0963 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
@@ -729,4 +729,99 @@ div#userFilter  #check {
 
 .keyColumn {
   width: 20px;
-}
\ No newline at end of file
+}
+
+/**
+START - Alert widget onside menu
+*/
+div.alert-widget > a > .label {
+  font-size: 9px;
+  line-height: 0.9;
+  padding: 2px 3px;
+  position: absolute;
+  margin-left: 10px;
+  text-align: center;
+  top: 0px;
+}
+
+div.alert-widget > a {
+  display: block;
+  position: relative;
+}
+
+div.alert-widget > a > i {
+  position: absolute;
+  top: 9px;
+}
+
+div.alert-widget{
+  text-align: center;
+  vertical-align: middle;
+  padding-right: 20px;
+}
+
+div.alert-widget .dropdown-menu > li.header {
+  background-color: #ffffff;
+  border-bottom: 1px solid #f4f4f4;
+  border-radius: 4px 4px 0 0;
+  color: #444444;
+  font-size: 14px;
+  padding: 7px 10px;
+}
+
+div.alert-widget .dropdown-menu > li.footer > a {
+  background-color: #fff;
+  border-radius: 0 0 4px 4px;
+  color: #444 !important;
+  font-size: 12px;
+  padding: 7px 10px;
+  text-align: center;
+}
+
+div.alert-widget .dropdown-menu > li .menu {
+  list-style: outside none none;
+  padding: 10px;
+}
+/**
+END - Alert widget onside menu
+*/
+
+/**
+START - Transformers toggle panel
+*/
+div#transformersTogglePanel {
+  background-color: rgba(140, 140, 140, 0.99) !important;
+  width: 1000px !important;
+}
+
+div#transformersContainer {
+  padding: 15px;
+}
+
+div#transformersContainer input {
+  background-color: rgba(200, 200, 200, 0.60) !important;
+}
+
+div#transformersContainer #footer {
+  clear: both;
+  display: block;
+  text-align: right;
+}
+
+div#transformersContainer #body {
+  clear: both;
+  display: block;
+}
+
+div#transformersContainer #body select {
+  border: 1px solid #ccc !important;
+  background: rgba(240, 240, 240, 0.95) !important
+}
+
+div#transformersContainer #body a {
+  color: #ccc !important;
+  cursor: pointer !important;
+}
+/**
+END - Transformers toggle panel
+*/

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel.html
new file mode 100644
index 0000000..152766f
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel.html
@@ -0,0 +1,35 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <head><title></title></head>
+  <body>
+    <wicket:extend>
+      <div id="transformersContainer">
+        <form wicket:id="form">
+          <div id="body">
+            <span wicket:id="classes"/>
+          </div>
+          <div id="footer">
+            <input type="button" wicket:id="submit" class="btn" wicket:message="value:finish"></input>
+          </div>
+        </form>
+      </div>
+    </wicket:extend>
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel.properties
new file mode 100644
index 0000000..e3d6fd7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+finish=Finish
+palette.available=Available Mapping Item Transformers
+palette.selected=Selected Transformers

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_it.properties
new file mode 100644
index 0000000..827394e
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_it.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+finish=Fine
+palette.available=Mapping Item Transformer Disponibili
+palette.selected=Transformer Selezionati

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_pt_BR.properties
new file mode 100644
index 0000000..e3d6fd7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_pt_BR.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+finish=Finish
+palette.available=Available Mapping Item Transformers
+palette.selected=Selected Transformers

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_ru.properties
new file mode 100644
index 0000000..e3d6fd7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/tasks/TransformersTogglePanel_ru.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+finish=Finish
+palette.available=Available Mapping Item Transformers
+palette.selected=Selected Transformers

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget$AlertLink.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget$AlertLink.html b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget$AlertLink.html
new file mode 100644
index 0000000..3c9973d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget$AlertLink.html
@@ -0,0 +1,23 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:panel>
+    <span wicket:id="alert">[ALERT]</span>
+  </wicket:panel>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget.html b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget.html
new file mode 100644
index 0000000..e9a6433
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget.html
@@ -0,0 +1,41 @@
+<!--
+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>
+    <a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+      <i wicket:id="icon"></i>
+      <span class="label label-danger" wicket:id="alerts"></span>
+    </a>
+    <ul class="dropdown-menu">
+      <li class="header">
+        <wicket:message key="summary"><span wicket:id="number"/></wicket:message>
+      </li>
+      <li>
+        <ul wicket:id="latestAlertsList" class="menu">
+          <li class="todoitem" wicket:id="latestAlerts">
+            <span wicket:id="alert">[ALERT]</span>
+          </li>
+        </ul>
+      </li>
+      <li class="footer">
+        <a href="#" wicket:id="alertsLink"><wicket:message key="alerts.view.all">View all alerts</wicket:message></a>
+      </li>
+    </ul>
+  </wicket:panel>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget.properties
new file mode 100644
index 0000000..d26ac1e
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+alerts.view.all=View all alerts
+summary=${number} alert(s)

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_it.properties
new file mode 100644
index 0000000..d50350c
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_it.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+alerts.view.all=Tutti gli avvisi
+summary=${number} avvisi

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_pt_BR.properties
new file mode 100644
index 0000000..d26ac1e
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_pt_BR.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+alerts.view.all=View all alerts
+summary=${number} alert(s)

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_ru.properties
new file mode 100644
index 0000000..9f12445
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/AlertWidget_ru.properties
@@ -0,0 +1,21 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# approvals.view.all=\u00d0\u009f\u00d0\u00be\u00d1\u0081\u00d0\u00bc\u00d0\u00be\u00d1\u0082\u00d1\u0080\u00d0\u00b5\u00d1\u0082\u00d1\u008c \u00d0\u00b2\u00d1\u0081\u00d0\u00b5 \u00d0\u00b7\u00d0\u00b0\u00d1\u008f\u00d0\u00b2\u00d0\u00ba\u00d0\u00b8
+alerts.view.all=View all alerts
+# summary=${number} \u00d0\u00be\u00d0\u00b6\u00d0\u00b8\u00d0\u00b4\u00d0\u00b0\u00d1\u008e\u00d1\u0082 \u00d1\u0081\u00d0\u00be\u00d0\u00b3\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d0\u00be\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u008f
+summary=${number} alert(s)

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget$InnerPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget$InnerPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget$InnerPanel.html
new file mode 100644
index 0000000..4e95b13
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget$InnerPanel.html
@@ -0,0 +1,27 @@
+<!--
+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>
+    <a href="#" wicket:id="approval">
+      <h3><small class="pull-right" wicket:id="owner"/> <p wicket:id="key"/></h3>
+      <small wicket:id="dueDateContainer" class="pull-right"><i class="fa fa-hourglass-end"></i> <p wicket:id="dueDate"/></small>
+      <small><i class="fa fa-clock-o"></i> <p wicket:id="createTime"/></small>
+    </a>
+  </wicket:panel>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.html b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.html
deleted file mode 100644
index 4abfe9b..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-  <wicket:panel>
-    <a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
-      <i class="fa fa-flag-o"></i>
-      <span class="label label-danger" wicket:id="approvals"></span>
-    </a>
-    <ul class="dropdown-menu">
-      <li class="header">
-        <wicket:message key="summary"><span wicket:id="number"/></wicket:message>
-      </li>
-      <li>
-        <ul wicket:id="lastApprovalsList" class="menu">
-          <li class="todoitem" wicket:id="lastApprovals">
-            <a href="#" wicket:id="approval">
-              <h3><small class="pull-right" wicket:id="owner"/> <p wicket:id="key"/></h3>
-              <small wicket:id="dueDateContainer" class="pull-right"><i class="fa fa-hourglass-end"></i> <p wicket:id="dueDate"/></small>
-              <small><i class="fa fa-clock-o"></i> <p wicket:id="createTime"/></small>
-            </a>
-          </li>
-        </ul>
-      </li>
-      <li class="footer">
-        <a href="#" wicket:id="approvalsLink"><wicket:message key="approvals.view.all">View all approvals</wicket:message></a>
-      </li>
-    </ul>
-  </wicket:panel>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.properties
index 0ca887b..bdf7ec7 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget.properties
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-approvals.view.all=View All approvals
+alerts.view.all=View All approvals
 duedate=Due date
 owner=Owner
 createApproval=Create Approval

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_it.properties
index d358219..ca41eeb 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_it.properties
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-approvals.view.all=Tutti le approvazioni
+alerts.view.all=Tutti le approvazioni
 duedate=Scadenza
 owner=Assegnato
 createApproval=Approvazione Creazione

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_pt_BR.properties
index 6ede07e..4ded669 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_pt_BR.properties
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-approvals.view.all=View All Approvals
+alerts.view.all=View All Approvals
 duedate=Due date
 owner=Owner
 createApproval=Create Approval

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_ru.properties
index fd78461..803865f 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_ru.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/ApprovalsWidget_ru.properties
@@ -15,13 +15,13 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-# approvals.view.all=Посмотреть все заявки
-approvals.view.all=\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u044f\u0432\u043a\u0438
-# duedate=Срок
+# approvals.view.all=\u00d0\u009f\u00d0\u00be\u00d1\u0081\u00d0\u00bc\u00d0\u00be\u00d1\u0082\u00d1\u0080\u00d0\u00b5\u00d1\u0082\u00d1\u008c \u00d0\u00b2\u00d1\u0081\u00d0\u00b5 \u00d0\u00b7\u00d0\u00b0\u00d1\u008f\u00d0\u00b2\u00d0\u00ba\u00d0\u00b8
+alerts.view.all=\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u044f\u0432\u043a\u0438
+# duedate=\u00d0\u00a1\u00d1\u0080\u00d0\u00be\u00d0\u00ba
 duedate=\u0421\u0440\u043e\u043a
-# owner=Владелец
+# owner=\u00d0\u0092\u00d0\u00bb\u00d0\u00b0\u00d0\u00b4\u00d0\u00b5\u00d0\u00bb\u00d0\u00b5\u00d1\u0086
 owner=\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446
-# createApproval=Создать заявку
+# createApproval=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d1\u0082\u00d1\u008c \u00d0\u00b7\u00d0\u00b0\u00d1\u008f\u00d0\u00b2\u00d0\u00ba\u00d1\u0083
 createApproval=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u044f\u0432\u043a\u0443
-# summary=${number} ожидают согласования
+# summary=${number} \u00d0\u00be\u00d0\u00b6\u00d0\u00b8\u00d0\u00b4\u00d0\u00b0\u00d1\u008e\u00d1\u0082 \u00d1\u0081\u00d0\u00be\u00d0\u00b3\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d0\u00be\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u008f
 summary=${number} \u043e\u0436\u0438\u0434\u0430\u044e\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget.properties
new file mode 100644
index 0000000..d12923b
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+alerts.view.all=View All Mapping Tranformers
+summary=${number} selected transformer(s)

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_it.properties
new file mode 100644
index 0000000..5e85664
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_it.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+alerts.view.all=Tutti i Mapping Transformer
+summary=${number} transformer selezionati

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_pt_BR.properties
new file mode 100644
index 0000000..d12923b
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_pt_BR.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+alerts.view.all=View All Mapping Tranformers
+summary=${number} selected transformer(s)

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_ru.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_ru.properties b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_ru.properties
new file mode 100644
index 0000000..3418dad
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/widgets/MappingItemTransformerWidget_ru.properties
@@ -0,0 +1,21 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# approvals.view.all=\u00d0\u009f\u00d0\u00be\u00d1\u0081\u00d0\u00bc\u00d0\u00be\u00d1\u0082\u00d1\u0080\u00d0\u00b5\u00d1\u0082\u00d1\u008c \u00d0\u00b2\u00d1\u0081\u00d0\u00b5 \u00d0\u00b7\u00d0\u00b0\u00d1\u008f\u00d0\u00b2\u00d0\u00ba\u00d0\u00b8
+alerts.view.all=View All Mapping Tranformers
+# summary=${number} \u00d0\u00be\u00d0\u00b6\u00d0\u00b8\u00d0\u00b4\u00d0\u00b0\u00d1\u008e\u00d1\u0082 \u00d1\u0081\u00d0\u00be\u00d0\u00b3\u00d0\u00bb\u00d0\u00b0\u00d1\u0081\u00d0\u00be\u00d0\u00b2\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u008f
+summary=${number} selected transformer(s)

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.html
index 2b717e2..b202b23 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.html
@@ -17,70 +17,80 @@ 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="table-responsive no-padding">
-      <table id="mappings"
-             class="table table-hover"
-             style="font-size: 1em;margin-top:2px;"
-             wicket:id="mappingContainer">
-        <tbody>
-          <tr>
-            <th><wicket:message key="entity"/></th>
-            <th><wicket:message key="intMappingTypes"/></th>
-            <th><wicket:message key="intAttrNames"/></th>
-            <th><wicket:message key="extAttrNames"/></th>
-            <th>
-              <wicket:message key="mandatoryCondition"/>
-              <span id="popover" wicket:id="jexlInfo" class="glyphicon glyphicon-info-sign"></span>
-            </th>
-            <th><wicket:message key="connObjectKey"/></th>
-            <th><label wicket:id="passwordLabel"/></th>
-            <th><wicket:message key="purpose"/></th>
-            <th><i class="fa fa-trash"></i></th>
-          </tr>
-          <tr wicket:id="mappings">
-            <td>
-              <span wicket:id="entities">[entities]</span>
-            </td>
-            <td>
-              <span wicket:id="intMappingTypes">[intMappingTypes]</span>
-            </td>
-            <td>
-              <span wicket:id="intAttrNames">[intAttrNames]</span>
-            </td>
-            <td>
-              <span wicket:id="extAttrName">[extAttrName]</span>
-            </td>
-            <td>
-              <span wicket:id="mandatoryCondition">[mandatoryCondition]</span>
-            </td>
-            <td>
-              <span wicket:id="connObjectKey">[connObjectKey]</span>
-            </td>
-            <td>
-              <span wicket:id="password">[password]</span>
-            </td>
-            <td>
-              <div wicket:id="purpose" style="margin: 10px 0px 10px 0px">
-                <span wicket:id="purposeActions">[purpose]</span>
-              </div>
-            </td>
-            <td>
-              <div style="margin: 10px 0px 10px 0px">
-                <span  wicket:id="toRemove"/>
-              </div>
-            </td>
-          </tr>
-        </tbody>
+  <head><title></title></head>
+  <body>
+    <wicket:panel>
+      <div class="table-responsive no-padding">
+        <table id="mappings"
+               class="table table-hover"
+               style="font-size: 1em;margin-top:2px;"
+               wicket:id="mappingContainer">
+          <tbody>
+            <tr>
+              <th><wicket:message key="entity"/></th>
+              <th><wicket:message key="intMappingTypes"/></th>
+              <th><wicket:message key="intAttrNames"/></th>
+              <th><wicket:message key="extAttrNames"/></th>
+              <th><i class="fa fa-magic"></i></th>
+              <th>
+                <wicket:message key="mandatoryCondition"/>
+                <span id="popover" wicket:id="jexlInfo" class="glyphicon glyphicon-info-sign"></span>
+              </th>
+              <th><wicket:message key="connObjectKey"/></th>
+              <th><label wicket:id="passwordLabel"/></th>
+              <th><wicket:message key="purpose"/></th>
+              <th><i class="fa fa-trash"></i></th>
+            </tr>
+            <tr wicket:id="mappings">
+              <td>
+                <span wicket:id="entities">[entities]</span>
+              </td>
+              <td>
+                <span wicket:id="intMappingTypes">[intMappingTypes]</span>
+              </td>
+              <td>
+                <span wicket:id="intAttrNames">[intAttrNames]</span>
+              </td>
+              <td>
+                <span wicket:id="extAttrName">[extAttrName]</span>
+              </td>
+              <td>
+                <div class="alert-widget dropdown tasks-menu">
+                  <span wicket:id="transformers">[Mapping Item Transformes]</span>
+                </div>
+              </td>
+              <td>
+                <span wicket:id="mandatoryCondition">[mandatoryCondition]</span>
+              </td>
+              <td>
+                <span wicket:id="connObjectKey">[connObjectKey]</span>
+              </td>
+              <td>
+                <span wicket:id="password">[password]</span>
+              </td>
+              <td>
+                <div wicket:id="purpose" style="margin: 10px 0px 10px 0px">
+                  <span wicket:id="purposeActions">[purpose]</span>
+                </div>
+              </td>
+              <td>
+                <div>
+                  <span  wicket:id="toRemove"/>
+                </div>
+              </td>
+            </tr>
+          </tbody>
 
-        <tfoot>
-          <tr>
-            <td colspan="9" style="padding: 5px; text-align: right">
-              <input type="submit" class="btn btn-primary" wicket:id="addMappingBtn" />
-            </td>
-          </tr>
-        </tfoot>
-      </table>
-    </div>
-  </wicket:panel>
+          <tfoot>
+            <tr>
+              <td colspan="10" style="padding: 5px; text-align: right">
+                <input type="submit" class="btn btn-primary" wicket:id="addMappingBtn" />
+              </td>
+            </tr>
+          </tfoot>
+        </table>
+      </div>
+      <span wicket:id="transformersTogglePanel">[TRANSFORMERS]</span>
+    </wicket:panel>
+  </body>
 </html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties
index b930016..d9fabb4 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.properties
@@ -25,6 +25,7 @@ intMappingTypes=Internal mapping types
 entity=Entity
 groupSchema=Role Schema
 connObjectKey=Remote Key
+transformers=Item Transformers
 mandatoryCondition=Mandatory
 password=Password
 purpose=Purpose

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties
index ce5395f..4d4e1d7 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_it.properties
@@ -25,6 +25,7 @@ intMappingTypes=Tipo mapping interno
 entity=Entit&agrave;
 groupSchema=Schema Ruolo
 connObjectKey=Chiave remota
+transformers=Item Transformers
 mandatoryCondition=Obbligatorio
 password=Password
 purpose=Scopo

http://git-wip-us.apache.org/repos/asf/syncope/blob/32726184/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties
index 91558a5..1c58a0b 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel_pt_BR.properties
@@ -25,6 +25,7 @@ intMappingTypes=Tipos internos de mapeamentos
 entity=Entidade
 groupSchema=Esquema de Fun\u00e7\u00e3o
 connObjectKey=Remote Key
+transformers=Item Transformers
 mandatoryCondition=Obrigat\u00f3rio
 password=Senha
 purpose=Prop\u00f3sito