You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/02/05 17:01:19 UTC

[48/52] syncope git commit: [SYNCOPE-620] Console working, Selenium IT in

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.html
----------------------------------------------------------------------
diff --git a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.html b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.html
index a308eef..b1729c1 100644
--- a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.html
+++ b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.html
@@ -29,18 +29,18 @@ under the License.
       <span wicket:id="templates">[templates]</span>
     </div>
 
-    <div id="attrs">
+    <div id="plainAttrs">
       <div id="formtable">
         <div class="tablerow">
           <div class="tablecolumn_label short_dynamicsize">
-            <wicket:message key="inheritAttrs"/>
+            <wicket:message key="inheritPlainAttrs"/>
           </div>
           <div class="tablecolumn_field medium_dynamicsize">
-            <span wicket:id="inheritAttrs" />
+            <span wicket:id="inheritPlainAttrs" />
           </div>
         </div>
 
-        <span wicket:id="attrs">[role attributes]</span>
+        <span wicket:id="plainAttrs">[role attributes]</span>
       </div>
     </div>
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.properties
----------------------------------------------------------------------
diff --git a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.properties b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.properties
index 38b4584..86aace6 100644
--- a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.properties
+++ b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel.properties
@@ -46,6 +46,6 @@ virAttrValue=Virtual value
 
 addAttributeBtn=Add
 
-inheritAttrs=Inherit attributes
+inheritPlainAttrs=Inherit plain attributes
 inheritDerAttrs=Inherit derived attributes
 inheritVirAttrs=Inherit virtual attributes

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_it.properties
----------------------------------------------------------------------
diff --git a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_it.properties b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_it.properties
index 8fc1ccf..068abdc 100644
--- a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_it.properties
+++ b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_it.properties
@@ -46,7 +46,7 @@ virAttrValue=Valore virtuale
 
 addAttributeBtn=Aggiungi
 
-inheritAttrs=Eredita attributi
+inheritPlainAttrs=Eredita attributi normali
 inheritDerAttrs=Eredita attributi derivati
 inheritVirAttrs=Eredita attributi virtuali
 firstEntitlementsList=Entitlement ruolo

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_pt_BR.properties b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_pt_BR.properties
index bf48ab6..e480811 100644
--- a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_pt_BR.properties
+++ b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RolePanel_pt_BR.properties
@@ -35,6 +35,6 @@ virAttrValue=Valor Virtual
 
 addAttributeBtn=Adicionar
 
-inheritAttrs=Atributos Herdados
+inheritPlainAttrs=Atributos Herdados Normal
 inheritDerAttrs=Atributos Herdados Derivados
 inheritVirAttrs=Atributos Virtuais Herdados

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.html
----------------------------------------------------------------------
diff --git a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.html b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.html
index 113fc12..226c172 100644
--- a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.html
+++ b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.html
@@ -20,10 +20,10 @@ under the License.
   <wicket:panel>
     <div style="float:left; width:70%;">
       <script type="text/javascript">
-        $(document).ready(function() {
+        $(document).ready(function () {
           $("div form #tabs").tabs();
         });
-        $(document).ready(function() {
+        $(document).ready(function () {
           $("div form #tabs #templates").tabs();
         });
       </script>
@@ -38,7 +38,7 @@ under the License.
           <ul>
             <li><a href="#details"><span><wicket:message key="details"/></span></a></li>
             <li><a href="#templates"><span><wicket:message key="templates"/></span></a></li>
-            <li><a href="#attrs"><span><wicket:message key="attrs"/></span></a></li>
+            <li><a href="#plainAttrs"><span><wicket:message key="plainAttrs"/></span></a></li>
             <li><a href="#derAttrs"><span><wicket:message key="derAttrs"/></span></a></li>
             <li><a href="#virAttrs"><span><wicket:message key="virAttrs"/></span></a></li>
             <li><a href="#resources"><span><wicket:message key="resources"/></span></a></li>

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.properties
----------------------------------------------------------------------
diff --git a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.properties b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.properties
index 605c289..b49cf51 100644
--- a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.properties
+++ b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel.properties
@@ -16,7 +16,7 @@
 # under the License.
 title=Role
 details=Details
-attrs=Attributes
+plainAttrs=Plain attributes
 derAttrs=Derived attributes
 virAttrs=Virtual attributes
 resources=Resources

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_it.properties
----------------------------------------------------------------------
diff --git a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_it.properties b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_it.properties
index 26ef8a5..727fe69 100644
--- a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_it.properties
+++ b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_it.properties
@@ -16,7 +16,7 @@
 # under the License.
 title=Ruolo
 details=Dettagli
-attrs=Attributi
+plainAttrs=Attributi normali
 derAttrs=Attributi derivati
 virAttrs=Attributi virtuali
 resources=Risorse

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_pt_BR.properties b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_pt_BR.properties
index 2ecc202..f01ecac 100644
--- a/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_pt_BR.properties
+++ b/syncope620/client/console/src/main/resources/org/apache/syncope/client/console/panels/RoleTabPanel_pt_BR.properties
@@ -16,7 +16,7 @@
 # under the License.
 title=Fun\u00e7\u00e3o
 details=Detalhes
-attrs=Atributos
+plainAttrs=Atributos Normal
 derAttrs=Atributos Derivados
 virAttrs=Atributos Virtuais
 resources=Recursos

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/AttributableOperations.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/AttributableOperations.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/AttributableOperations.java
index ad5d322..1c53db6 100644
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/AttributableOperations.java
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/AttributableOperations.java
@@ -358,14 +358,14 @@ public final class AttributableOperations {
         }
 
         // 5. templates
-        Set<String> updatedTemplates = new HashSet<>(updated.getRAttrTemplates());
-        Set<String> originalTemplates = new HashSet<>(original.getRAttrTemplates());
+        Set<String> updatedTemplates = new HashSet<>(updated.getRPlainAttrTemplates());
+        Set<String> originalTemplates = new HashSet<>(original.getRPlainAttrTemplates());
         if (updatedTemplates.equals(originalTemplates)) {
             result.setModRAttrTemplates(false);
             result.getRPlainAttrTemplates().clear();
         } else {
             result.setModRAttrTemplates(true);
-            result.getRPlainAttrTemplates().addAll(updated.getRAttrTemplates());
+            result.getRPlainAttrTemplates().addAll(updated.getRPlainAttrTemplates());
         }
         updatedTemplates = new HashSet<>(updated.getRDerAttrTemplates());
         originalTemplates = new HashSet<>(original.getRDerAttrTemplates());
@@ -385,14 +385,14 @@ public final class AttributableOperations {
             result.setModRVirAttrTemplates(true);
             result.getRVirAttrTemplates().addAll(updated.getRVirAttrTemplates());
         }
-        updatedTemplates = new HashSet<>(updated.getMAttrTemplates());
-        originalTemplates = new HashSet<>(original.getMAttrTemplates());
+        updatedTemplates = new HashSet<>(updated.getMPlainAttrTemplates());
+        originalTemplates = new HashSet<>(original.getMPlainAttrTemplates());
         if (updatedTemplates.equals(originalTemplates)) {
             result.setModMAttrTemplates(false);
             result.getMPlainAttrTemplates().clear();
         } else {
             result.setModMAttrTemplates(true);
-            result.getMPlainAttrTemplates().addAll(updated.getMAttrTemplates());
+            result.getMPlainAttrTemplates().addAll(updated.getMPlainAttrTemplates());
         }
         updatedTemplates = new HashSet<>(updated.getMDerAttrTemplates());
         originalTemplates = new HashSet<>(original.getMDerAttrTemplates());

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/RoleReportletConf.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/RoleReportletConf.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/RoleReportletConf.java
index e91252d..9f73d3d 100644
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/RoleReportletConf.java
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/RoleReportletConf.java
@@ -53,7 +53,7 @@ public class RoleReportletConf extends AbstractReportletConf {
     private String matchingCond;
 
     @FormAttributeField(schema = IntMappingType.RolePlainSchema)
-    private final List<String> attrs = new ArrayList<>();
+    private final List<String> plainAttrs = new ArrayList<>();
 
     @FormAttributeField(schema = IntMappingType.RoleDerivedSchema)
     private final List<String> derAttrs = new ArrayList<>();
@@ -75,7 +75,7 @@ public class RoleReportletConf extends AbstractReportletConf {
     @XmlElement(name = "plainAttribute")
     @JsonProperty("plainAttributes")
     public List<String> getPlainAttrs() {
-        return attrs;
+        return plainAttrs;
     }
 
     @XmlElementWrapper(name = "derivedAttributes")

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java
index c82052c..78735eb 100644
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/report/UserReportletConf.java
@@ -58,7 +58,7 @@ public class UserReportletConf extends AbstractReportletConf {
     private String matchingCond;
 
     @FormAttributeField(schema = IntMappingType.UserPlainSchema)
-    private final List<String> attrs = new ArrayList<>();
+    private final List<String> plainAttrs = new ArrayList<>();
 
     @FormAttributeField(schema = IntMappingType.UserDerivedSchema)
     private final List<String> derAttrs = new ArrayList<>();
@@ -80,7 +80,7 @@ public class UserReportletConf extends AbstractReportletConf {
     @XmlElement(name = "plainAttribute")
     @JsonProperty("plainAttributes")
     public List<String> getPlainAttrs() {
-        return attrs;
+        return plainAttrs;
     }
 
     @XmlElementWrapper(name = "derivedAttributes")

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/search/SearchableFields.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/search/SearchableFields.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/search/SearchableFields.java
index 5a006f5..4945cca 100644
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/search/SearchableFields.java
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/search/SearchableFields.java
@@ -20,8 +20,10 @@ package org.apache.syncope.common.lib.search;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.to.AbstractAttributableTO;
 import org.apache.syncope.common.lib.to.RoleTO;
@@ -31,9 +33,7 @@ import org.apache.syncope.common.lib.types.SubjectType;
 public class SearchableFields {
 
     protected static final String[] ATTRIBUTES_NOTINCLUDED = {
-        "plainAttrs", "derAttrs", "virAttrs",
-        "serialVersionUID", "memberships", "entitlements", "resources", "password",
-        "propagationTOs", "propagationStatusMap"
+        "serialVersionUID", "password"
     };
 
     public static final List<String> get(final SubjectType subjectType) {
@@ -49,7 +49,10 @@ public class SearchableFields {
         Class<?> clazz = attributableRef;
         while (clazz != null && clazz != Object.class) {
             for (Field field : clazz.getDeclaredFields()) {
-                if (!ArrayUtils.contains(ATTRIBUTES_NOTINCLUDED, field.getName())) {
+                if (!ArrayUtils.contains(ATTRIBUTES_NOTINCLUDED, field.getName())
+                        && !Collection.class.isAssignableFrom(field.getType())
+                        && !Map.class.isAssignableFrom(field.getType())) {
+
                     fieldNames.add(field.getName());
                 }
             }
@@ -58,7 +61,6 @@ public class SearchableFields {
 
         Collections.reverse(fieldNames);
         return fieldNames;
-
     }
 
     private SearchableFields() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSubjectTO.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSubjectTO.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSubjectTO.java
index 5c9fa42..a2e1b3a 100644
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSubjectTO.java
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractSubjectTO.java
@@ -45,7 +45,7 @@ public abstract class AbstractSubjectTO extends AbstractAttributableTO {
 
     public boolean removePropagationTO(final String resource) {
         if (resource != null && getPropagationStatusTOs().isEmpty()) {
-            final List<PropagationStatus> toBeRemoved = new ArrayList<PropagationStatus>();
+            final List<PropagationStatus> toBeRemoved = new ArrayList<>();
 
             for (PropagationStatus propagationTO : getPropagationStatusTOs()) {
                 if (resource.equals(propagationTO.getResource())) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
index b921e53..51feffa 100644
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/NotificationTO.java
@@ -37,7 +37,7 @@ public class NotificationTO extends AbstractBaseBean {
 
     private Long key;
 
-    private List<String> events = new ArrayList<>();
+    private final List<String> events = new ArrayList<>();
 
     private String userAbout;
 
@@ -45,7 +45,7 @@ public class NotificationTO extends AbstractBaseBean {
 
     private String recipients;
 
-    private List<String> staticRecipients = new ArrayList<>();
+    private final List<String> staticRecipients = new ArrayList<>();
 
     private IntMappingType recipientAttrType;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
index 2a353cf..7f0f0af 100644
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/to/RoleTO.java
@@ -59,13 +59,13 @@ public class RoleTO extends AbstractSubjectTO {
 
     private final List<String> entitlements = new ArrayList<>();
 
-    private List<String> rAttrTemplates = new ArrayList<>();
+    private List<String> rPlainAttrTemplates = new ArrayList<>();
 
     private List<String> rDerAttrTemplates = new ArrayList<>();
 
     private List<String> rVirAttrTemplates = new ArrayList<>();
 
-    private List<String> mAttrTemplates = new ArrayList<>();
+    private List<String> mPlainAttrTemplates = new ArrayList<>();
 
     private List<String> mDerAttrTemplates = new ArrayList<>();
 
@@ -154,11 +154,11 @@ public class RoleTO extends AbstractSubjectTO {
         return entitlements;
     }
 
-    @XmlElementWrapper(name = "rAttrTemplates")
-    @XmlElement(name = "rAttrTemplate")
-    @JsonProperty("rAttrTemplates")
-    public List<String> getRAttrTemplates() {
-        return rAttrTemplates;
+    @XmlElementWrapper(name = "rPlainAttrTemplates")
+    @XmlElement(name = "rPlainAttrTemplate")
+    @JsonProperty("rPlainAttrTemplates")
+    public List<String> getRPlainAttrTemplates() {
+        return rPlainAttrTemplates;
     }
 
     @XmlElementWrapper(name = "rDerAttrTemplates")
@@ -175,11 +175,11 @@ public class RoleTO extends AbstractSubjectTO {
         return rVirAttrTemplates;
     }
 
-    @XmlElementWrapper(name = "mAttrTemplates")
-    @XmlElement(name = "mAttrTemplate")
-    @JsonProperty("mAttrTemplates")
-    public List<String> getMAttrTemplates() {
-        return mAttrTemplates;
+    @XmlElementWrapper(name = "mPlainAttrTemplates")
+    @XmlElement(name = "mPlainAttrTemplate")
+    @JsonProperty("mPlainAttrTemplates")
+    public List<String> getMPlainAttrTemplates() {
+        return mPlainAttrTemplates;
     }
 
     @XmlElementWrapper(name = "mDerAttrTemplates")

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicySpec.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicySpec.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicySpec.java
index cac7c1c..7de0e48 100644
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicySpec.java
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/PolicySpec.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.common.lib.types;
 
-public interface PolicySpec {
+import java.io.Serializable;
+
+public interface PolicySpec extends Serializable {
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/SubjectId.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/SubjectId.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/SubjectId.java
deleted file mode 100644
index d61f1d9..0000000
--- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/SubjectId.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.wrap;
-
-public class SubjectId extends AbstractWrappable<Long> {
-
-    private static final long serialVersionUID = -8664228651057889297L;
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/SubjectKey.java
----------------------------------------------------------------------
diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/SubjectKey.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/SubjectKey.java
new file mode 100644
index 0000000..930cf35
--- /dev/null
+++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/wrap/SubjectKey.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib.wrap;
+
+public class SubjectKey extends AbstractWrappable<Long> {
+
+    private static final long serialVersionUID = -8664228651057889297L;
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
----------------------------------------------------------------------
diff --git a/syncope620/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java b/syncope620/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
index b0580c3..9199d37 100644
--- a/syncope620/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
+++ b/syncope620/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
@@ -39,7 +39,7 @@ import org.apache.syncope.common.lib.to.ConnObjectTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.ResourceDeassociationActionType;
 import org.apache.syncope.common.lib.types.SubjectType;
-import org.apache.syncope.common.lib.wrap.SubjectId;
+import org.apache.syncope.common.lib.wrap.SubjectKey;
 
 /**
  * REST operations for external resources.
@@ -133,7 +133,7 @@ public interface ResourceService extends JAXRSService {
      * @param resourceKey name of resource
      * @param subjectType subject type (user or role)
      * @param type resource de-association action type
-     * @param subjectIds users or roles against which the bulk action will be performed
+     * @param subjectKeys users or roles against which the bulk action will be performed
      * @return <tt>Response</tt> object featuring {@link BulkActionResult} as <tt>Entity</tt>
      */
     @Descriptions({
@@ -146,7 +146,7 @@ public interface ResourceService extends JAXRSService {
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     BulkActionResult bulkDeassociation(@NotNull @PathParam("resourceKey") String resourceKey,
             @NotNull @PathParam("subjType") SubjectType subjectType,
-            @NotNull @PathParam("type") ResourceDeassociationActionType type, @NotNull List<SubjectId> subjectIds);
+            @NotNull @PathParam("type") ResourceDeassociationActionType type, @NotNull List<SubjectKey> subjectKeys);
 
     /**
      * Executes the provided bulk action.

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/fit/console-reference/pom.xml
----------------------------------------------------------------------
diff --git a/syncope620/fit/console-reference/pom.xml b/syncope620/fit/console-reference/pom.xml
new file mode 100644
index 0000000..6d94373
--- /dev/null
+++ b/syncope620/fit/console-reference/pom.xml
@@ -0,0 +1,525 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.syncope</groupId>
+    <artifactId>syncope-fit</artifactId>
+    <version>2.0.0-SNAPSHOT</version>
+  </parent>
+
+  <name>Apache Syncope FIT Console Reference</name>
+  <description>Apache Syncope FIT Console Reference</description>
+  <groupId>org.apache.syncope.fit</groupId>
+  <artifactId>syncope-fit-console-reference</artifactId>
+  <packaging>war</packaging>
+  
+  <properties>
+    <rootpom.basedir>${basedir}/../..</rootpom.basedir>
+  </properties>
+
+  <dependencies>
+    <dependency> 
+      <groupId>javax.servlet</groupId> 
+      <artifactId>javax.servlet-api</artifactId> 
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet.jsp</groupId>
+      <artifactId>javax.servlet.jsp-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>jstl</artifactId>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.apache.syncope.client</groupId>
+      <artifactId>syncope-client-console</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.lmax</groupId>
+      <artifactId>disruptor</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-slf4j-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>jcl-over-slf4j</artifactId>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.webjars</groupId>
+      <artifactId>jquery-ui</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.webjars</groupId>
+      <artifactId>codemirror</artifactId>
+    </dependency>
+    
+    <!-- TEST -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.activiti</groupId>
+      <artifactId>activiti-webapp-explorer2</artifactId>            
+      <type>war</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.syncope.fit</groupId>
+      <artifactId>syncope-fit-build-tools</artifactId>
+      <version>${project.version}</version>
+      <type>war</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>net.tirasa.connid.bundles.soap</groupId>
+      <artifactId>wssample</artifactId>
+      <version>${connid.soap.version}</version>
+      <type>war</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.h2database</groupId>
+      <artifactId>h2</artifactId>
+      <scope>test</scope>
+    </dependency>
+    
+    <!-- SELENIUM INTEGRATION TEST -->
+    <dependency>
+      <groupId>org.seleniumhq.selenium</groupId>
+      <artifactId>selenium-java</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.seleniumhq.selenium</groupId>
+      <artifactId>selenium-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-antrun-plugin</artifactId>
+        <inherited>true</inherited>
+        <executions>
+          <execution>
+            <id>setupActivitiModeler</id>
+            <phase>process-resources</phase>
+            <configuration>
+              <target>
+                <unzip src="${settings.localRepository}/org/activiti/activiti-webapp-explorer2/${activiti.version}/activiti-webapp-explorer2-${activiti.version}.war" dest="${project.build.directory}/activiti-webapp-explorer2" />
+                
+                <mkdir dir="${activiti-modeler.directory}" />
+                
+                <mkdir dir="${activiti-modeler.directory}/editor" />
+                <copy todir="${activiti-modeler.directory}/editor">
+                  <fileset dir="${project.build.directory}/activiti-webapp-explorer2/editor">
+                    <exclude name="oryx.js" />
+                  </fileset>
+                </copy>
+                <copy file="${project.build.directory}/activiti-webapp-explorer2/WEB-INF/classes/plugins.xml" todir="${activiti-modeler.directory}/editor" />
+                <copy file="${project.build.directory}/activiti-webapp-explorer2/WEB-INF/classes/stencilset.json" todir="${activiti-modeler.directory}/editor" />
+                
+                <mkdir dir="${activiti-modeler.directory}/explorer" />
+                <copy todir="${activiti-modeler.directory}/explorer">
+                  <fileset dir="${project.build.directory}/activiti-webapp-explorer2/explorer" />
+                </copy>
+                
+                <mkdir dir="${activiti-modeler.directory}/libs" />
+                <copy todir="${activiti-modeler.directory}/libs">
+                  <fileset dir="${project.build.directory}/activiti-webapp-explorer2/libs" />
+                </copy>
+              </target>
+            </configuration>
+            <goals>
+              <goal>run</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      
+      <plugin>
+        <groupId>com.google.code.maven-replacer-plugin</groupId>
+        <artifactId>replacer</artifactId>
+        <executions>
+          <execution>
+            <phase>process-resources</phase>
+            <goals>
+              <goal>replace</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <file>${activiti-modeler.directory}/editor/oryx.debug.js</file>
+          <tokenValueMap>${basedir}/src/main/resources/oryx.debug.js-tokenValueMap.properties</tokenValueMap>
+          <unescape>true</unescape>
+          <regex>false</regex>
+        </configuration>
+      </plugin>
+      
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-war-plugin</artifactId>
+        <inherited>true</inherited>
+        <configuration>
+          <failOnMissingWebXml>false</failOnMissingWebXml>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.codehaus.cargo</groupId>
+        <artifactId>cargo-maven2-plugin</artifactId>
+        <inherited>true</inherited>
+        <configuration>
+          <container>
+            <dependencies>
+              <dependency>
+                <groupId>com.h2database</groupId>
+                <artifactId>h2</artifactId>
+              </dependency>
+            </dependencies>
+          </container>
+          <configuration>
+            <type>standalone</type>
+            <properties>
+              <cargo.servlet.port>${cargo.servlet.port}</cargo.servlet.port>
+              <cargo.tomcat.ajp.port>${cargo.tomcat.ajp.port}</cargo.tomcat.ajp.port>
+              <cargo.rmi.port>${cargo.rmi.port}</cargo.rmi.port>
+
+              <cargo.jvmargs>-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=512m</cargo.jvmargs>
+            </properties>
+            <configfiles>
+              <configfile>
+                <file>${project.build.directory}/classes/context.xml</file>
+                <todir>conf/</todir>
+                <tofile>context.xml</tofile>
+              </configfile>
+            </configfiles>
+          </configuration>
+          <deployables>
+            <deployable>
+              <groupId>net.tirasa.connid.bundles.soap</groupId>
+              <artifactId>wssample</artifactId>
+              <type>war</type>
+              <properties>
+                <context>wssample</context>
+              </properties>
+            </deployable>
+            <deployable>
+              <groupId>org.apache.syncope.fit</groupId>
+              <artifactId>syncope-fit-build-tools</artifactId>
+              <type>war</type>
+              <properties>
+                <context>syncope-fit-build-tools</context>
+              </properties>
+            </deployable>
+            <deployable>
+              <location>${basedir}/../server-reference/target/syncope-fit-server-reference-${project.version}</location>
+              <pingURL>http://localhost:${cargo.servlet.port}/syncope/cacheStats.jsp</pingURL>
+              <pingTimeout>60000</pingTimeout>
+              <properties>
+                <context>syncope</context>
+              </properties>
+            </deployable>
+            <deployable>
+              <location>${project.build.directory}/${project.build.finalName}</location>
+              <properties>
+                <context>syncope-console</context>
+              </properties>
+            </deployable>
+          </deployables>
+        </configuration>
+        <executions>
+          <execution>
+            <id>start-container</id>
+            <phase>pre-integration-test</phase>
+            <goals>
+              <goal>start</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>stop-container</id>
+            <phase>post-integration-test</phase>
+            <goals>
+              <goal>stop</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-pmd-plugin</artifactId>
+      </plugin>
+    </plugins>
+    
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+      </resource>
+    </resources>
+  </build>
+  
+  <profiles>
+    <profile>
+      <id>debug</id>
+
+      <properties>
+        <skipTests>true</skipTests>
+      </properties>
+
+      <build>
+        <defaultGoal>clean verify cargo:run</defaultGoal>
+
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.cargo</groupId>
+            <artifactId>cargo-maven2-plugin</artifactId>
+            <inherited>true</inherited>
+            <configuration>
+              <configuration>
+                <properties>
+                  <cargo.jvmargs>-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
+                    -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=512m</cargo.jvmargs>
+                </properties>
+              </configuration>
+            </configuration>
+            <executions>
+              <execution>
+                <id>start-container</id>
+                <phase>none</phase>
+              </execution>
+              <execution>
+                <id>stop-container</id>
+                <phase>none</phase>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    
+    <profile>
+      <id>skipTests</id>
+
+      <dependencies>
+        <dependency>
+          <groupId>com.h2database</groupId>
+          <artifactId>h2</artifactId>
+        </dependency>
+      </dependencies>
+      
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.cargo</groupId>
+            <artifactId>cargo-maven2-plugin</artifactId>
+            <inherited>true</inherited>
+            <configuration>
+              <deployables>
+                <deployable>
+                  <location>${project.build.directory}/${project.build.finalName}.war</location>
+                </deployable>
+              </deployables>
+            </configuration>
+            <executions>
+              <execution>
+                <id>install-container</id>
+                <phase>package</phase>
+                <goals>
+                  <goal>install</goal>
+                </goals>
+              </execution>
+              <execution>
+                <id>start-container</id>
+                <phase>none</phase>
+              </execution>
+              <execution>
+                <id>stop-container</id>
+                <phase>none</phase>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    
+    <profile>
+      <id>selenium</id>
+      
+      <build>
+        <defaultGoal>clean verify</defaultGoal>
+        <plugins>
+
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-failsafe-plugin</artifactId>
+            <inherited>true</inherited>
+            <executions>
+              <execution>
+                <id>verify</id>
+                <goals>
+                  <goal>verify</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+
+          <plugin>
+            <groupId>org.codehaus.cargo</groupId>
+            <artifactId>cargo-maven2-plugin</artifactId>
+            <inherited>true</inherited>
+            <executions>
+              <execution>
+                <id>start-container</id>
+                <phase>pre-integration-test</phase>
+                <goals>
+                  <goal>start</goal>
+                </goals>
+                <configuration>
+                  <wait>false</wait>
+                </configuration>
+              </execution>
+              <execution>
+                <id>stop-container</id>
+                <phase>post-integration-test</phase>
+                <goals>
+                  <goal>stop</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    
+    <profile>
+      <id>jrebel</id>
+      
+      <properties>
+        <javaagent>-javaagent:${env.REBEL_HOME}/jrebel.jar</javaagent>
+      </properties>
+      
+      <build>
+        <defaultGoal>clean verify cargo:run</defaultGoal>
+
+        <plugins>
+          <plugin>
+            <groupId>org.zeroturnaround</groupId>
+            <artifactId>jrebel-maven-plugin</artifactId>
+            <inherited>true</inherited>
+            <configuration>
+              <classpath>
+                <fallback>default</fallback>
+                <resources>
+                  <resource/>
+                  <resource>
+                    <directory>${basedir}/../../client/console/target/classes</directory>
+                  </resource>
+                </resources>
+              </classpath>
+              
+              <web>
+                <resources>
+                  <resource/>
+                  <resource>
+                    <target>/</target>
+                    <directory>${basedir}/../../client/console/target/classes/META-INF/resources/</directory>
+                  </resource>
+                </resources>
+              </web>
+    
+              <alwaysGenerate>true</alwaysGenerate>
+            </configuration>
+            <executions>
+              <execution>
+                <id>generate-rebel-xml</id>
+                <phase>process-resources</phase>
+                <goals>
+                  <goal>generate</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+
+          <plugin>
+            <groupId>org.codehaus.cargo</groupId>
+            <artifactId>cargo-maven2-plugin</artifactId>
+            <inherited>true</inherited>
+            <configuration>
+              <configuration>
+                <properties>
+                  <cargo.jvmargs>-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
+                    -noverify ${javaagent} -Drebel.spring_plugin=true 
+                    -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=256m</cargo.jvmargs>
+                </properties>
+              </configuration>
+            </configuration>
+            <executions>
+              <execution>
+                <id>start-container</id>
+                <phase>none</phase>
+              </execution>
+              <execution>
+                <id>stop-container</id>
+                <phase>none</phase>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+</project>

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/fit/console-reference/src/main/resources/console.properties
----------------------------------------------------------------------
diff --git a/syncope620/fit/console-reference/src/main/resources/console.properties b/syncope620/fit/console-reference/src/main/resources/console.properties
new file mode 100644
index 0000000..cf20f3c
--- /dev/null
+++ b/syncope620/fit/console-reference/src/main/resources/console.properties
@@ -0,0 +1,22 @@
+# 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.
+console.directory=${conf.directory}
+scheme=http
+host=localhost
+port=9080
+rootPath=/syncope/rest/
+activitiModelerDirectory=${activiti-modeler.directory}

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/fit/console-reference/src/main/resources/context.xml
----------------------------------------------------------------------
diff --git a/syncope620/fit/console-reference/src/main/resources/context.xml b/syncope620/fit/console-reference/src/main/resources/context.xml
new file mode 100644
index 0000000..471d561
--- /dev/null
+++ b/syncope620/fit/console-reference/src/main/resources/context.xml
@@ -0,0 +1,23 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!--
+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.
+-->
+<Context>
+  <!-- Disable session persistence across Tomcat restarts -->
+  <Manager pathname=""/>
+</Context>

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/fit/console-reference/src/main/resources/log4j2.xml
----------------------------------------------------------------------
diff --git a/syncope620/fit/console-reference/src/main/resources/log4j2.xml b/syncope620/fit/console-reference/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..a7c1fa6
--- /dev/null
+++ b/syncope620/fit/console-reference/src/main/resources/log4j2.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<configuration status="WARN">
+
+  <appenders>
+
+    <RollingRandomAccessFile name="main" fileName="${log.directory}/console.log"
+                             filePattern="${log.directory}/console-%d{yyyy-MM-dd}.log.gz"
+                             immediateFlush="false" append="true">
+      <PatternLayout>
+        <pattern>%d{HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
+      </PatternLayout>
+      <Policies>
+        <TimeBasedTriggeringPolicy/>
+        <SizeBasedTriggeringPolicy size="250 MB"/>
+      </Policies>
+    </RollingRandomAccessFile>
+    
+  </appenders>
+
+  <loggers>
+
+    <asyncLogger name="org.apache.syncope.client.lib" additivity="false" level="OFF">
+      <appender-ref ref="main"/>
+    </asyncLogger>
+
+    <asyncLogger name="org.apache.syncope.client.console" additivity="false" level="ERROR">
+      <appender-ref ref="main"/>
+    </asyncLogger>
+
+    <asyncLogger name="org.apache.wicket" additivity="false" level="ERROR">
+      <appender-ref ref="main"/>
+    </asyncLogger>
+
+    <asyncLogger name="org.springframework" additivity="false" level="ERROR">
+      <appender-ref ref="main"/>
+    </asyncLogger>
+    
+    <asyncLogger name="org.apache.cxf" additivity="false" level="ERROR">
+      <appender-ref ref="main"/>
+    </asyncLogger>
+    
+    <root level="ERROR">
+      <appender-ref ref="main"/>
+    </root>
+  
+  </loggers>
+  
+</configuration>

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/fit/console-reference/src/main/resources/oryx.debug.js-tokenValueMap.properties
----------------------------------------------------------------------
diff --git a/syncope620/fit/console-reference/src/main/resources/oryx.debug.js-tokenValueMap.properties b/syncope620/fit/console-reference/src/main/resources/oryx.debug.js-tokenValueMap.properties
new file mode 100644
index 0000000..17fdbcc
--- /dev/null
+++ b/syncope620/fit/console-reference/src/main/resources/oryx.debug.js-tokenValueMap.properties
@@ -0,0 +1,35 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ORYX.CONFIG.ROOT_PATH \=					"../editor/"; //TODO: Remove last slash!!=BASE_PATH =                                     window.location.toString().substr(0, window.location.toString().indexOf('/wicket'));\nORYX.CONFIG.ROOT_PATH =				BASE_PATH + "/activiti-modeler/editor/";
+ORYX.CONFIG.EXPLORER_PATH \=				"../explorer";=ORYX.CONFIG.EXPLORER_PATH =			BASE_PATH + "/activiti-modeler/explorer";
+ORYX.CONFIG.LIBS_PATH \=					"../libs";=ORYX.CONFIG.LIBS_PATH =				BASE_PATH + "/activiti-modeler/libs";
+ORYX.CONFIG.SYNTAXCHECKER_URL \==ORYX.CONFIG.PLUGINS_CONFIG =			ORYX.CONFIG.ROOT_PATH + "plugins.xml";\nORYX.CONFIG.SYNTAXCHECKER_URL =
+this._baseUrl \= "../editor/stencilsets/bpmn2.0/";=this._baseUrl = ORYX.CONFIG.ROOT_PATH + "stencilsets/bpmn2.0/";
+this._source \= "../stencilsets/bpmn2.0/bpmn2.0.json";=this._source = ORYX.CONFIG.ROOT_PATH + "stencilsets/bpmn2.0/bpmn2.0.json";
+"../service/editor/stencilset"=ORYX.CONFIG.ROOT_PATH + "stencilset.json"
+ORYX.Editor.createByUrl=modelUrl = BASE_PATH + "/workflowDefGET";\nORYX.Editor.createByUrl
+../explorer/src/img/signavio/smoky/logo2.png="+ORYX.CONFIG.EXPLORER_PATH+"/src/img/signavio/smoky/logo2.png
+<a href\=\\""+ORYX.CONFIG.WEB_URL+"\\" target\=\\"_self\\" title\=\\"close modeler\\">=<a href=\\"#\\" title=\\"close modeler\\" onclick=\\"window.close();\\">
+../editor/images/close_button.png="+ORYX.CONFIG.ROOT_PATH+"images/close_button.png
+height:16px;width:16px;margin-bottom:-4px;background: transparent url(../libs/ext-2.0.2/resources/images/default/tree/loading.gif) no-repeat center;=height:16px;width:16px;margin-bottom:-4px;background: transparent url("+ORYX.CONFIG.LIBS_PATH+"/ext-2.0.2/resources/images/default/tree/loading.gif) no-repeat center;
+icon: '../editor/images/add.png',=icon: ORYX.CONFIG.ROOT_PATH + 'images/add.png',
+icon: '../editor/images/delete.png',=icon: ORYX.CONFIG.ROOT_PATH + 'images/delete.png',
+id\="edit_model_title"=id="edit_model_title" readonly="readonly"
+id\="edit_model_summary"=id="edit_model_summary" readonly="readonly"
+"../service/model/" + modelMeta.modelId + "/json"=BASE_PATH + "/workflowDefGET"
+// Send the request to the server.=saveUri = BASE_PATH + "/workflowDefPUT";\n// Send the request to the server.
+'Accept':"application/json", 'Content-Type':'charset\=UTF-8'='Accept':"application/json", 'Content-Type':'application/json'
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java
----------------------------------------------------------------------
diff --git a/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java b/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java
new file mode 100644
index 0000000..1bd2027
--- /dev/null
+++ b/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AbstractITCase.java
@@ -0,0 +1,70 @@
+/*
+ * 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.fit.console.reference;
+
+import org.junit.After;
+import org.junit.Before;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractITCase {
+
+    /**
+     * Logger.
+     */
+    protected static final Logger LOG = LoggerFactory.getLogger(AbstractITCase.class);
+
+    public static final String ADMIN = "admin";
+
+    public static final String PASSWORD = "password";
+
+    public static final String BASE_URL = "http://localhost:9080/syncope-console/";
+
+    protected WebDriver seleniumDriver;
+
+    protected WebDriverWait wait;
+
+    @Before
+    public void setUp() throws Exception {
+        seleniumDriver = new FirefoxDriver();
+        seleniumDriver.get(BASE_URL);
+        wait = new WebDriverWait(seleniumDriver, 10);
+
+        WebElement element = seleniumDriver.findElement(By.name("userId"));
+        element.sendKeys(ADMIN);
+        element = seleniumDriver.findElement(By.name("password"));
+        element.sendKeys(PASSWORD);
+        seleniumDriver.findElement(By.name("p::submit")).click();
+
+        (new WebDriverWait(seleniumDriver, 10))
+                .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//img[@alt='Logout']")));
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Logout\"]")).click();
+        seleniumDriver.quit();
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AccessITCase.java
----------------------------------------------------------------------
diff --git a/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AccessITCase.java b/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AccessITCase.java
new file mode 100644
index 0000000..557e9af
--- /dev/null
+++ b/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/AccessITCase.java
@@ -0,0 +1,80 @@
+/*
+ * 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.fit.console.reference;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+public class AccessITCase extends AbstractITCase {
+
+    @Test
+    public void clickAround() {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Schema\"]")).click();
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']/ul/li[2]/a")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[2]/a")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//div[@id='uschema']/div/div/span/ul/li[2]/a")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='uschema']/div/div/span/ul/li[2]/a")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='uschema']/div/div/span/ul/li[3]/a")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[3]/a")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='mschema']/div/div/span/ul/li[2]/a")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='mschema']/div/div/span/ul/li[3]/a")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[4]/a")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[@id='rschema']/div/div/span/ul/li[2]/a")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='rschema']/div/div/span/ul/li[3]/a")).click();
+
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Users\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[3]/ul/li[2]/a/span")));
+        seleniumDriver.findElement(By.xpath("//div[3]/ul/li[2]/a/span")).click();
+
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Roles\"]")).click();
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//img[@alt=\"Resources\"]")));
+
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Resources\"]")).click();
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//img[@alt=\"TODO\"]")));
+
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"TODO\"]")).click();
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//img[@alt=\"Reports\"]")));
+
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Reports\"]")).click();
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//img[@alt=\"Configuration\"]")));
+
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Configuration\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']/ul/li[2]/a/span")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[3]/a/span")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[3]/a/span")).click();
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Tasks\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']/ul/li[2]/a/span")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[2]/a/span")).click();
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Tasks\"]")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[4]/a/span")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[5]/a/span")).click();
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/07aa4585/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/ConfigurationITCase.java
----------------------------------------------------------------------
diff --git a/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/ConfigurationITCase.java b/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/ConfigurationITCase.java
new file mode 100644
index 0000000..b4a06f5
--- /dev/null
+++ b/syncope620/fit/console-reference/src/test/java/org/apache/syncope/fit/console/reference/ConfigurationITCase.java
@@ -0,0 +1,402 @@
+/*
+ * 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.fit.console.reference;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.Select;
+
+public class ConfigurationITCase extends AbstractITCase {
+
+    @Test
+    public void editParameters() {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Configuration\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//img[@title='Parameters']")));
+
+        seleniumDriver.findElement(By.xpath("//img[@title='Parameters']/ancestor::a")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe")));
+        seleniumDriver.switchTo().frame(0);
+
+        seleniumDriver.findElement(
+                By.xpath("//span[contains(text(), 'log.lastlogindate')]/../../div[2]/span/input")).click();
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/input[@type='submit']")).click();
+
+        seleniumDriver.switchTo().defaultContent();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("feedback")));
+        assertTrue(
+                seleniumDriver.findElement(By.tagName("body")).getText().contains("Operation executed successfully"));
+    }
+
+    @Test
+    public void browsePasswordPolicy() {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Configuration\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[2]/a")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='policies']/ul/li[2]/a")).click();
+        seleniumDriver.findElement(By.xpath("//div[@id='password']/span/div/a")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe")));
+        seleniumDriver.switchTo().frame(0);
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@name='key:textField']")));
+
+        WebElement element = seleniumDriver.findElement(By.name("description:textField"));
+        element.sendKeys("new description");
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/input[@type='submit']")).click();
+        seleniumDriver.switchTo().defaultContent();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("feedback")));
+        assertTrue(
+                seleniumDriver.findElement(By.tagName("body")).getText().contains("Operation executed successfully"));
+    }
+
+    @Test
+    public void browseWorkflowDef() {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Configuration\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[5]/a/span")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='workflow']/div/span/img")));
+    }
+
+    @Test
+    public void setLogLevel() {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Configuration\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[6]/a")).click();
+
+        final Select select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[@id='core']/div/span/table/tbody/tr/td[2]/select")));
+        select.selectByVisibleText("ERROR");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='workflow']/div/span/img")));
+        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("feedback")));
+        assertTrue(
+                seleniumDriver.findElement(By.tagName("body")).getText().contains("Operation executed successfully"));
+    }
+
+    @Test
+    public void createNotification() {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Configuration\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[3]/a")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[@id='notifications']/a")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe")));
+        seleniumDriver.switchTo().frame(0);
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[2]/form/div[3]/div/div/div/div/label")));
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@name='sender:textField']")));
+
+        seleniumDriver.findElement(By.name("sender:textField")).sendKeys("test@syncope.it");
+
+        seleniumDriver.findElement(By.name("subject:textField")).sendKeys("test@syncope.it");
+
+        Select select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[3]/div[2]/span/select")));
+        select.selectByVisibleText("UserPlainSchema");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//div[2]/form/div[3]/div/div/div[4]/div[2]/span/select/option[2]")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[4]/div[2]/span/select")));
+        select.selectByVisibleText("fullname");
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[5]/div[2]/span/select")));
+        select.selectByVisibleText("optin");
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[6]/div[2]/span/select")));
+        select.selectByVisibleText("ALL");
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[3]/a/span")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[2]/a/span")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//select[@name='eventSelection:categoryContainer:type:dropDownChoiceField']"
+                        + "/option[text()='PROPAGATION']")));
+
+        select = new Select(seleniumDriver.findElement(By.xpath(
+                "//select[@name='eventSelection:categoryContainer:type:dropDownChoiceField']")));
+        select.selectByVisibleText("PROPAGATION");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//select[@name='eventSelection:categoryContainer:category:dropDownChoiceField']"
+                        + "/option[text()='role']")));
+
+        select = new Select(seleniumDriver.findElement(By.xpath(
+                "//select[@name='eventSelection:categoryContainer:category:dropDownChoiceField']")));
+        select.selectByVisibleText("role");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//select[@name='eventSelection:categoryContainer:subcategory:dropDownChoiceField']"
+                        + "/option[text()='resource-db-sync']")));
+
+        select = new Select(seleniumDriver.findElement(By.xpath(
+                "//select[@name='eventSelection:categoryContainer:subcategory:dropDownChoiceField']")));
+        select.selectByVisibleText("resource-db-sync");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//input[@name='eventSelection:eventsContainer:eventsPanel:failureGroup']")));
+
+        seleniumDriver.findElement(By.xpath("//div[@class='eventSelectionWidzard']/div[2]/div[3]/span/div/input")).
+                click();
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[4]/a")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div[4]/div/div/span/input")).click();
+
+        wait.until(ExpectedConditions.elementToBeClickable(By.name(
+                "staticRecipients:multiValueContainer:view:0:panel:textField")));
+
+        seleniumDriver.findElement(By.name(
+                "staticRecipients:multiValueContainer:view:0:panel:textField")).
+                sendKeys("syncope445@syncope.apache.org");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//div[2]/form/div[3]/div[4]/div/div[2]/label")));
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[4]/input")).click();
+
+        seleniumDriver.switchTo().defaultContent();
+    }
+
+    @Test
+    public void createDisabledNotification() {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Configuration\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[3]/a")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[@id='notifications']/a")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe")));
+        seleniumDriver.switchTo().frame(0);
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[2]/form/div[3]/div/div/div/div/label")));
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@name='sender:textField']")));
+
+        seleniumDriver.findElement(By.name("sender:textField")).sendKeys("test@syncope.it");
+
+        Select select = new Select(seleniumDriver.findElement(
+                By.xpath("//div[2]/form/div[3]/div/div[1]/div[3]/div[2]/span/select")));
+        select.selectByVisibleText("UserPlainSchema");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(
+                "//div[2]/form/div[3]/div/div/div[4]/div[2]/span/select/option[2]")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[4]/div[2]/span/select")));
+        select.selectByVisibleText("fullname");
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[5]/div[2]/span/select")));
+        select.selectByVisibleText("optin");
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[6]/div[2]/span/select")));
+        select.selectByVisibleText("ALL");
+
+        // disable notification
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[7]/div[2]/span/input")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[3]/a/span")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[2]/a/span")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(
+                "//select[@name='eventSelection:categoryContainer:type:dropDownChoiceField']"
+                + "/option[text()='PROPAGATION']")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath(
+                                "//select[@name='eventSelection:categoryContainer:type:dropDownChoiceField']")));
+        select.selectByVisibleText("PROPAGATION");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(
+                "//select[@name='eventSelection:categoryContainer:category:dropDownChoiceField']"
+                + "/option[text()='role']")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath(
+                                "//select[@name='eventSelection:categoryContainer:category:dropDownChoiceField']")));
+        select.selectByVisibleText("role");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(
+                "//select[@name='eventSelection:categoryContainer:subcategory:dropDownChoiceField']"
+                + "/option[text()='resource-db-sync']")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath(
+                                "//select[@name='eventSelection:categoryContainer:subcategory:dropDownChoiceField']")));
+        select.selectByVisibleText("resource-db-sync");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(
+                "//input[@name='eventSelection:eventsContainer:eventsPanel:failureGroup']")));
+
+        seleniumDriver.findElement(By.xpath("//div[@class='eventSelectionWidzard']/div[2]/div[3]/span/div/input")).
+                click();
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[4]/a/span")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div[4]/div/div/span/input")).click();
+
+        wait.until(ExpectedConditions.elementToBeClickable(By.name(
+                "staticRecipients:multiValueContainer:view:0:panel:textField")));
+
+        seleniumDriver.findElement(
+                By.name("staticRecipients:multiValueContainer:view:0:panel:textField"))
+                .sendKeys("syncope492@syncope.apache.org");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(
+                "//div[2]/form/div[3]/div[4]/div/div[2]/label")));
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[4]/input")).click();
+
+        seleniumDriver.switchTo().defaultContent();
+    }
+
+    @Test
+    public void issueSYNCOPE446() {
+        seleniumDriver.findElement(By.xpath("//img[@alt=\"Configuration\"]")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='tabs']")));
+
+        seleniumDriver.findElement(By.xpath("//div[@id='tabs']/ul/li[3]/a")).click();
+
+        seleniumDriver.findElement(By.xpath("//div[@id='notifications']/a")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe")));
+        seleniumDriver.switchTo().frame(0);
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[2]/form/div[3]/div/div/div/div/label")));
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@name='sender:textField']")));
+
+        seleniumDriver.findElement(By.name("sender:textField")).sendKeys("syncope446@syncope.it");
+        seleniumDriver.findElement(By.name("subject:textField")).sendKeys("Test issue Syncope 446");
+
+        Select select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[3]/div[2]/span/select")));
+        select.selectByVisibleText("UserPlainSchema");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//div[2]/form/div[3]/div/div/div[4]/div[2]/span/select/option[2]")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[4]/div[2]/span/select")));
+        select.selectByVisibleText("email");
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[5]/div[2]/span/select")));
+        select.selectByVisibleText("optin");
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div/div/div[6]/div[2]/span/select")));
+        select.selectByVisibleText("ALL");
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[3]/a/span")).click();
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[2]/a/span")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//select[@name='eventSelection:categoryContainer:type:dropDownChoiceField']"
+                        + "/option[text()='REST']")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath(
+                                "//select[@name='eventSelection:categoryContainer:type:dropDownChoiceField']")));
+        select.selectByVisibleText("REST");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//select[@name='eventSelection:categoryContainer:category:dropDownChoiceField']"
+                        + "/option[text()='RoleLogic']")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath(
+                                "//select[@name='eventSelection:categoryContainer:category:dropDownChoiceField']")));
+        select.selectByVisibleText("RoleLogic");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//input[@name='eventSelection:eventsContainer:eventsPanel:successGroup']")));
+
+        seleniumDriver.findElement(
+                By.xpath("//div[@class='eventSelectionWidzard']/div[2]/div[3]/span/div/input")).click();
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[3]/a/span")).click();
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/div[3]/span/div[4]/div/span/input")).click();
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(
+                By.xpath("//select[@name='aboutContainer:roleAbout:searchFormContainer:searchView:0:type']"
+                        + "/option[text()='ENTITLEMENT']")));
+
+        wait.until(ExpectedConditions.elementToBeClickable(
+                By.xpath("//select[@name='aboutContainer:roleAbout:searchFormContainer:searchView:0:type']")));
+
+        select = new Select(
+                seleniumDriver.findElement(By.xpath(
+                                "//select[@name='aboutContainer:roleAbout:searchFormContainer:searchView:0:type']")));
+        select.selectByVisibleText("ENTITLEMENT");
+
+        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(
+                "//select[@name='aboutContainer:roleAbout:searchFormContainer:searchView:0:property']"
+                + "/option[text()='ROLE_CREATE']")));
+
+        select = new Select(seleniumDriver.findElement(By.xpath(
+                "//select[@name='aboutContainer:roleAbout:searchFormContainer:searchView:0:property']")));
+        select.selectByVisibleText("ROLE_CREATE");
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[3]/ul/li[4]/a/span")).click();
+        seleniumDriver.findElement(By.xpath("//input[@name='recipientsContainer:checkRecipients:checkboxField']")).
+                click();
+
+        wait.until(ExpectedConditions.elementToBeClickable(By.name(
+                "staticRecipients:multiValueContainer:view:0:panel:textField")));
+
+        seleniumDriver.findElement(By.name("staticRecipients:multiValueContainer:view:0:panel:textField")).
+                sendKeys("syncope446@syncope.apache.org");
+
+        seleniumDriver.findElement(By.xpath("//div[2]/form/div[4]/input")).click();
+
+        seleniumDriver.switchTo().defaultContent();
+    }
+}