keycloak-aplcache

Changes

events/syslog/pom.xml 38(+0 -38)

events/syslog/src/main/java/org/keycloak/events/log/SysLoggingEventListenerProvider.java 93(+0 -93)

events/syslog/src/main/java/org/keycloak/events/log/SysLoggingEventListenerProviderFactory.java 53(+0 -53)

events/syslog/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory 1(+0 -1)

forms/common-themes/pom.xml 32(+0 -32)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/angular/angular-translate-loader-url.js 75(+0 -75)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/angular/jstd-scenario-adapter-config.js 6(+0 -6)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/angular.treeview.js 97(+0 -97)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/angular.treeview.min.js 9(+0 -9)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/css/angular.treeview.css 99(+0 -99)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/README.md 122(+0 -122)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/angular/version.txt 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload.js 156(+0 -156)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload.min.js 2(+0 -2)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.js 25(+0 -25)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-shim.js 215(+0 -215)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-shim.min.js 2(+0 -2)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-114-precomposed.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-144-precomposed.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-57-precomposed.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-72-precomposed.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand.svg 87(+0 -87)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand-lg.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/favicon.ico 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/logo.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/logo.svg 22(+0 -22)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner.gif 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner-lg.gif 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner-sm.gif 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/js/patternfly.js 212(+0 -212)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/js/patternfly.min.js 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/LICENSE 18(+0 -18)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/README.md 83(+0 -83)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/release.sh 69(+0 -69)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2.jquery.json 36(+0 -36)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ar.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ca.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_cs.js 49(+0 -49)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_da.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_de.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_el.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_en.js.template 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_es.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_et.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_eu.js 43(+0 -43)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_fi.js 28(+0 -28)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_fr.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_gl.js 43(+0 -43)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_he.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_hr.js 42(+0 -42)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_hu.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_id.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_is.js 16(+0 -16)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_it.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ja.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ko.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_lt.js 29(+0 -29)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_lv.js 16(+0 -16)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_mk.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_nl.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_no.js 18(+0 -18)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pl.js 37(+0 -37)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pt-BR.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pt-PT.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ro.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ru.js 15(+0 -15)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_sk.js 48(+0 -48)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_sv.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_tr.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ua.js 17(+0 -17)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_vi.js 18(+0 -18)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_zh-CN.js 14(+0 -14)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_zh-TW.js 14(+0 -14)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2-spinner.gif 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2x2.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/common/resources/lib/zocial/zocial-regular-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/email/html/email-verification.ftl 5(+0 -5)

forms/common-themes/src/main/resources/theme/keycloak/email/html/event-login_error.ftl 5(+0 -5)

forms/common-themes/src/main/resources/theme/keycloak/email/html/event-remove_totp.ftl 5(+0 -5)

forms/common-themes/src/main/resources/theme/keycloak/email/html/event-update_password.ftl 5(+0 -5)

forms/common-themes/src/main/resources/theme/keycloak/email/html/event-update_totp.ftl 5(+0 -5)

forms/common-themes/src/main/resources/theme/keycloak/email/html/executeActions.ftl 5(+0 -5)

forms/common-themes/src/main/resources/theme/keycloak/email/html/password-reset.ftl 5(+0 -5)

forms/common-themes/src/main/resources/theme/keycloak/email/messages/messages_ca.properties 21(+0 -21)

forms/common-themes/src/main/resources/theme/keycloak/email/messages/messages_de.properties 21(+0 -21)

forms/common-themes/src/main/resources/theme/keycloak/email/messages/messages_en.properties 24(+0 -24)

forms/common-themes/src/main/resources/theme/keycloak/email/messages/messages_es.properties 21(+0 -21)

forms/common-themes/src/main/resources/theme/keycloak/email/messages/messages_fr.properties 24(+0 -24)

forms/common-themes/src/main/resources/theme/keycloak/email/messages/messages_pt_BR.properties 24(+0 -24)

forms/common-themes/src/main/resources/theme/keycloak/email/text/email-verification.ftl 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/email/text/event-login_error.ftl 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/email/text/event-remove_totp.ftl 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/email/text/event-update_password.ftl 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/email/text/event-update_totp.ftl 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/email/text/executeActions.ftl 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/email/text/identity-provider-link.ftl 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/email/text/password-reset.ftl 1(+0 -1)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/css/login.css 305(+0 -305)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/img/favicon.ico 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/img/feedback-error-arrow-down.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/img/feedback-error-sign.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/img/feedback-success-arrow-down.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/img/feedback-success-sign.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/img/feedback-warning-arrow-down.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/img/feedback-warning-sign.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/login/resources/img/keycloak-logo.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/login/theme.properties 46(+0 -46)

forms/common-themes/src/main/resources/theme/keycloak/welcome/index.ftl 106(+0 -106)

forms/common-themes/src/main/resources/theme/keycloak/welcome/resources/favicon.ico 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/welcome/resources/jboss_community.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/keycloak/welcome/resources/keycloak.css 65(+0 -65)

forms/common-themes/src/main/resources/theme/keycloak/welcome/resources/keycloak_logo.png 0(+0 -0)

forms/pom.xml 21(+0 -21)

pom.xml 16(+2 -14)

themes/pom.xml 26(+10 -16)

Details

diff --git a/dependencies/server-min/pom.xml b/dependencies/server-min/pom.xml
index 4dddea7..1124294 100755
--- a/dependencies/server-min/pom.xml
+++ b/dependencies/server-min/pom.xml
@@ -55,7 +55,7 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
-            <artifactId>keycloak-forms-common-themes</artifactId>
+            <artifactId>keycloak-themes</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/distribution/feature-packs/server-feature-pack/assembly.xml b/distribution/feature-packs/server-feature-pack/assembly.xml
index 4cd92ce..8a7c614 100644
--- a/distribution/feature-packs/server-feature-pack/assembly.xml
+++ b/distribution/feature-packs/server-feature-pack/assembly.xml
@@ -59,7 +59,7 @@
             <outputDirectory>content</outputDirectory>
         </fileSet>
         <fileSet>
-            <directory>../../../forms/common-themes/src/main/resources/theme</directory>
+            <directory>../../../themes/src/main/resources/theme</directory>
             <outputDirectory>content/standalone/configuration/themes</outputDirectory>
             <includes>
                 <include>**/**</include>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-server-subsystem/main/server-war/WEB-INF/jboss-deployment-structure.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-server-subsystem/main/server-war/WEB-INF/jboss-deployment-structure.xml
index eb63999..853a2bd 100755
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-server-subsystem/main/server-war/WEB-INF/jboss-deployment-structure.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-server-subsystem/main/server-war/WEB-INF/jboss-deployment-structure.xml
@@ -3,7 +3,7 @@
         <dependencies>
             <module name="org.keycloak.keycloak-common" services="import"/>
             <module name="org.keycloak.keycloak-core" services="import"/>
-            <module name="org.keycloak.keycloak-forms-common-themes" services="import"/>
+            <module name="org.keycloak.keycloak-themes" services="import"/>
             <module name="org.keycloak.keycloak-js-adapter" services="import"/>
             <module name="org.keycloak.keycloak-kerberos-federation" services="import"/>
             <module name="org.keycloak.keycloak-ldap-federation" services="import"/>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-services/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-services/main/module.xml
index 267e926..ab80857 100755
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-services/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-services/main/module.xml
@@ -9,7 +9,7 @@
     <dependencies>
         <module name="org.keycloak.keycloak-common" services="import"/>
         <module name="org.keycloak.keycloak-core" services="import"/>
-        <module name="org.keycloak.keycloak-forms-common-themes" services="import"/>
+        <module name="org.keycloak.keycloak-themes" services="import"/>
         <module name="org.keycloak.keycloak-js-adapter" services="import"/>
         <module name="org.keycloak.keycloak-kerberos-federation" services="import"/>
         <module name="org.keycloak.keycloak-ldap-federation" services="import"/>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wildfly-extensions/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wildfly-extensions/main/module.xml
index 3fed420..6ec3555 100755
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wildfly-extensions/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wildfly-extensions/main/module.xml
@@ -8,7 +8,7 @@
         <module name="org.keycloak.keycloak-core"/>
         <module name="org.keycloak.keycloak-server-spi"/>
         <module name="org.keycloak.keycloak-services"/>
-        <module name="org.keycloak.keycloak-forms-common-themes"/>
+        <module name="org.keycloak.keycloak-themes"/>
         <module name="org.jboss.modules"/>
     </dependencies>
 </module>
diff --git a/misc/logo/login-bkgrnd.svg b/misc/logo/login-bkgrnd.svg
index 6a2db8b..a15f96f 100644
--- a/misc/logo/login-bkgrnd.svg
+++ b/misc/logo/login-bkgrnd.svg
@@ -15,7 +15,7 @@
    id="svg3601"
    version="1.1"
    inkscape:version="0.48.5 r10040"
-   inkscape:export-filename="/home/st/dev/keycloak/forms/common-themes/src/main/resources/theme/patternfly/login/resources/img/keycloak-bg.png"
+   inkscape:export-filename="/home/st/dev/keycloak/themes/src/main/resources/theme/patternfly/login/resources/img/keycloak-bg.png"
    inkscape:export-xdpi="90"
    inkscape:export-ydpi="90"
    sodipodi:docname="login-bkgrnd.svg">

pom.xml 16(+2 -14)

diff --git a/pom.xml b/pom.xml
index f664d15..ee11349 100755
--- a/pom.xml
+++ b/pom.xml
@@ -36,7 +36,6 @@
         <picketlink.version>2.7.0.Final</picketlink.version>
         <mongo.driver.version>3.2.0</mongo.driver.version>
         <jboss.logging.version>3.1.4.GA</jboss.logging.version>
-        <syslog4j.version>0.9.30</syslog4j.version>
         <jboss-logging-tools.version>1.2.0.Beta1</jboss-logging-tools.version>
         <jboss.spec.javax.xml.bind.jboss-jaxb-api_2.2_spec.version>1.0.4.Final</jboss.spec.javax.xml.bind.jboss-jaxb-api_2.2_spec.version>
         <jboss-jaxrs-api_2.0_spec>1.0.0.Final</jboss-jaxrs-api_2.0_spec>
@@ -145,9 +144,8 @@
         <module>proxy</module>
         <module>federation</module>
         <module>services</module>
-        <module>forms</module>
+        <module>themes</module>
         <module>model</module>
-        <module>events</module>
         <module>util</module>
         <module>wildfly</module>
         <module>integration</module>
@@ -300,11 +298,6 @@
                 <version>${jboss.logging.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.syslog4j</groupId>
-                <artifactId>syslog4j</artifactId>
-                <version>${syslog4j.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>log4j</groupId>
                 <artifactId>log4j</artifactId>
                 <version>${log4j.version}</version>
@@ -624,11 +617,6 @@
             </dependency>
             <dependency>
                 <groupId>org.keycloak</groupId>
-                <artifactId>keycloak-events-syslog</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.keycloak</groupId>
                 <artifactId>keycloak-kerberos-federation</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -651,7 +639,7 @@
             </dependency>
             <dependency>
                 <groupId>org.keycloak</groupId>
-                <artifactId>keycloak-forms-common-themes</artifactId>
+                <artifactId>keycloak-themes</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/angular-translate-loader-url.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/angular-translate-loader-url.js
new file mode 100644
index 0000000..619a819
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/angular-translate-loader-url.js
@@ -0,0 +1,75 @@
+/*!
+ * angular-translate - v2.7.2 - 2015-06-01
+ * http://github.com/angular-translate/angular-translate
+ * Copyright (c) 2015 ; Licensed MIT
+ */
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define([], function () {
+      return (factory());
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory();
+  } else {
+    factory();
+  }
+}(this, function () {
+
+angular.module('pascalprecht.translate')
+/**
+ * @ngdoc object
+ * @name pascalprecht.translate.$translateUrlLoader
+ * @requires $q
+ * @requires $http
+ *
+ * @description
+ * Creates a loading function for a typical dynamic url pattern:
+ * "locale.php?lang=en_US", "locale.php?lang=de_DE", "locale.php?language=nl_NL" etc.
+ * Prefixing the specified url, the current requested, language id will be applied
+ * with "?{queryParameter}={key}".
+ * Using this service, the response of these urls must be an object of
+ * key-value pairs.
+ *
+ * @param {object} options Options object, which gets the url, key and
+ * optional queryParameter ('lang' is used by default).
+ */
+.factory('$translateUrlLoader', $translateUrlLoader);
+
+function $translateUrlLoader($q, $http) {
+
+  'use strict';
+
+  return function (options) {
+
+    if (!options || !options.url) {
+      throw new Error('Couldn\'t use urlLoader since no url is given!');
+    }
+
+    var deferred = $q.defer(),
+        requestParams = {};
+
+    requestParams[options.queryParameter || 'lang'] = options.key;
+
+    $http(angular.extend({
+      url: options.url,
+      params: requestParams,
+      method: 'GET'
+    }, options.$http)).success(function (data) {
+      deferred.resolve(data);
+    }).error(function () {
+      deferred.reject(options.key);
+    });
+
+    return deferred.promise;
+  };
+}
+$translateUrlLoader.$inject = ['$q', '$http'];
+
+$translateUrlLoader.displayName = '$translateUrlLoader';
+return 'pascalprecht.translate';
+
+}));
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/jstd-scenario-adapter-config.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/jstd-scenario-adapter-config.js
new file mode 100755
index 0000000..212dd14
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/jstd-scenario-adapter-config.js
@@ -0,0 +1,6 @@
+/**
+ * Configuration for jstd scenario adapter 
+ */
+var jstdScenarioAdapter = {
+  relativeUrlPrefix: '/build/docs/'
+};
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/angular.treeview.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/angular.treeview.js
new file mode 100755
index 0000000..0e6512a
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/angular.treeview.js
@@ -0,0 +1,97 @@
+/*
+	@license Angular Treeview version 0.1.6
+	ⓒ 2013 AHN JAE-HA http://github.com/eu81273/angular.treeview
+	License: MIT
+
+
+	[TREE attribute]
+	angular-treeview: the treeview directive
+	tree-id : each tree's unique id.
+	tree-model : the tree model on $scope.
+	node-id : each node's id
+	node-label : each node's label
+	node-children: each node's children
+
+	<div
+		data-angular-treeview="true"
+		data-tree-id="tree"
+		data-tree-model="roleList"
+		data-node-id="roleId"
+		data-node-label="roleName"
+		data-node-children="children" >
+	</div>
+*/
+
+(function ( angular ) {
+	'use strict';
+
+	angular.module( 'angularTreeview', [] ).directive( 'treeModel', ['$compile', function( $compile ) {
+		return {
+			restrict: 'A',
+			link: function ( scope, element, attrs ) {
+				//tree id
+				var treeId = attrs.treeId;
+
+				//tree model
+				var treeModel = attrs.treeModel;
+
+				//node id
+				var nodeId = attrs.nodeId || 'id';
+
+				//node label
+				var nodeLabel = attrs.nodeLabel || 'label';
+
+				//children
+				var nodeChildren = attrs.nodeChildren || 'children';
+
+				//tree template
+
+                var template =
+                    '<ul>' +
+                    '<li data-ng-repeat="node in ' + treeModel + '">' +
+                        '<i ng-class="getGroupClass(node)" data-ng-click="' + treeId + '.selectNodeHead(node)"></i>' +
+                    '<span data-ng-class="getSelectedClass(node)" ng-dblclick="edit(node)" data-ng-click="' + treeId + '.selectNodeLabel(node)">{{node.' + nodeLabel + '}}</span>' +
+                    '<div data-ng-hide="node.collapsed" data-tree-id="' + treeId + '" data-tree-model="node.' + nodeChildren + '" data-node-id=' + nodeId + ' data-node-label=' + nodeLabel + ' data-node-children=' + nodeChildren + '></div>' +
+                    '</li>' +
+                    '</ul>';
+
+
+                //check tree id, tree model
+				if( treeId && treeModel ) {
+					//root node
+					if( attrs.angularTreeview ) {
+					
+						//create tree object if not exists
+						scope[treeId] = scope[treeId] || {};
+
+						//if node head clicks,
+						scope[treeId].selectNodeHead = scope[treeId].selectNodeHead || function( selectedNode ){
+
+							//Collapse or Expand
+							selectedNode.collapsed = !selectedNode.collapsed;
+                            scope[treeId].selectNodeLabel(selectedNode);
+						};
+
+						//if node label clicks,
+						scope[treeId].selectNodeLabel = scope[treeId].selectNodeLabel || function( selectedNode ){
+
+							//remove highlight from previous node
+							if( scope[treeId].currentNode && scope[treeId].currentNode.selected ) {
+								scope[treeId].currentNode.selected = undefined;
+							}
+
+							//set highlight to selected node
+							selectedNode.selected = 'selected';
+
+							//set currentNode
+							scope[treeId].currentNode = selectedNode;
+						};
+					}
+
+					//Rendering template.
+					element.html('').append( $compile( template )( scope ) );
+				}
+			}
+		};
+	}]);
+})( angular );
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/angular.treeview.min.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/angular.treeview.min.js
new file mode 100644
index 0000000..e02a85b
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/angular.treeview.min.js
@@ -0,0 +1,9 @@
+/*
+	@license Angular Treeview version 0.1.6
+	ⓒ 2013 AHN JAE-HA http://github.com/eu81273/angular.treeview
+	License: MIT
+*/
+
+(function(f){f.module("angularTreeview",[]).directive("treeModel",function($compile){return{restrict:"A",link:function(b,h,c){var a=c.treeId,g=c.treeModel,e=c.nodeLabel||"label",d=c.nodeChildren||"children",e='<ul><li data-ng-repeat="node in '+g+'"><i class="collapsed" data-ng-show="node.'+d+'.length && node.collapsed" data-ng-click="'+a+'.selectNodeHead(node)"></i><i class="expanded" data-ng-show="node.'+d+'.length && !node.collapsed" data-ng-click="'+a+'.selectNodeHead(node)"></i><i class="normal" data-ng-hide="node.'+
+d+'.length"></i> <span data-ng-class="node.selected" data-ng-click="'+a+'.selectNodeLabel(node)">{{node.'+e+'}}</span><div data-ng-hide="node.collapsed" data-tree-id="'+a+'" data-tree-model="node.'+d+'" data-node-id='+(c.nodeId||"id")+" data-node-label="+e+" data-node-children="+d+"></div></li></ul>";a&&g&&(c.angularTreeview&&(b[a]=b[a]||{},b[a].selectNodeHead=b[a].selectNodeHead||function(a){a.collapsed=!a.collapsed},b[a].selectNodeLabel=b[a].selectNodeLabel||function(c){b[a].currentNode&&b[a].currentNode.selected&&
+(b[a].currentNode.selected=void 0);c.selected="selected";b[a].currentNode=c}),h.html('').append($compile(e)(b)))}}})})(angular);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/css/angular.treeview.css b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/css/angular.treeview.css
new file mode 100755
index 0000000..d0986e7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/css/angular.treeview.css
@@ -0,0 +1,99 @@
+div[angular-treeview] {
+  /* prevent user selection */
+  -moz-user-select: -moz-none;
+  -khtml-user-select: none;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+
+  /* default */
+  font-family: Tahoma;
+  font-size:13px;
+  color: #555;
+  text-decoration: none;
+}
+
+div[tree-model] ul {
+  margin: 0;
+  padding: 0;
+  list-style: none; 
+  border: none;
+  overflow: hidden;
+}
+
+div[tree-model] li {
+  position: relative;
+  padding: 0 0 0 20px;
+  line-height: 20px;
+}
+
+div[tree-model] li .expanded {
+  padding: 1px 10px;
+  background-image: url("../img/folder.png");
+  background-repeat: no-repeat;
+}
+
+div[tree-model] li .collapsed {
+  padding: 1px 10px;
+  background-image: url("../img/folder-closed.png");
+  background-repeat: no-repeat;
+}
+
+div[tree-model] li .normal {
+  padding: 1px 10px;
+  background-image: url("../img/file.png");
+  background-repeat: no-repeat;
+}
+
+div[tree-model] li i, div[tree-model] li span {
+  cursor: pointer;
+}
+
+div[tree-model] li .selected {
+    background-color: #aaddff;
+    font-weight: bold;
+    padding: 1px 5px;
+}
+
+div[tree-model] li .cut {
+    font-weight: bold;
+    color: gray
+}
+
+/*
+.angular-ui-tree-handle {
+    cursor: grab;
+    text-decoration: none;
+    font-weight: bold;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    min-height: 20px;
+    line-height: 20px;
+}
+*/
+
+.angular-ui-tree-handle {
+    /* background: #f8faff; */
+    /*
+    color: #7c9eb2;    */
+    border: 1px solid #dae2ea;
+    padding: 10px 10px;
+    cursor: pointer;
+}
+
+.expanded-folder {
+    padding: 1px 10px;
+    background-image: url("../img/folder.png");
+    background-repeat: no-repeat;
+    cursor: pointer;
+}
+
+.collapsed-folder {
+    padding: 1px 10px;
+    background-image: url("../img/folder-closed.png");
+    background-repeat: no-repeat;
+    cursor: pointer;
+}
+
+
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/README.md b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/README.md
new file mode 100644
index 0000000..3c2a7b5
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/treeview/README.md
@@ -0,0 +1,122 @@
+Angular Treeview
+================
+
+Pure [AngularJS](http://www.angularjs.org) based tree menu directive.
+
+[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/preview.png)](http://jsfiddle.net/eu81273/8LWUc/)
+
+## Installation
+
+Copy the script and css into your project and add a script and link tag to your page.
+
+```html
+<script type="text/javascript" src="/angular.treeview.js"></script>
+<link rel="stylesheet" type="text/css" href="css/angular.treeview.css">
+```
+
+Add a dependency to your application module.
+
+```javascript
+angular.module('myApp', ['angularTreeview']);
+```
+
+Add a tree to your application. See [Usage](#usage).
+
+## Usage
+
+Attributes of angular treeview are below.
+
+- angular-treeview: the treeview directive.
+- tree-id : each tree's unique id.
+- tree-model : the tree model on $scope.
+- node-id : each node's id.
+- node-label : each node's label.
+- node-children: each node's children.
+
+Here is a simple example.
+
+
+```html
+<div
+    data-angular-treeview="true"
+	data-tree-id="abc"
+	data-tree-model="treedata"
+	data-node-id="id"
+	data-node-label="label"
+	data-node-children="children" >
+</div>
+```
+
+Example model:
+
+```javascript
+$scope.treedata = 
+[
+	{ "label" : "User", "id" : "role1", "children" : [
+		{ "label" : "subUser1", "id" : "role11", "children" : [] },
+		{ "label" : "subUser2", "id" : "role12", "children" : [
+			{ "label" : "subUser2-1", "id" : "role121", "children" : [
+				{ "label" : "subUser2-1-1", "id" : "role1211", "children" : [] },
+				{ "label" : "subUser2-1-2", "id" : "role1212", "children" : [] }
+			]}
+		]}
+	]},
+	{ "label" : "Admin", "id" : "role2", "children" : [] },
+	{ "label" : "Guest", "id" : "role3", "children" : [] }
+];	 
+```
+
+## Selection
+
+If tree node is selected, then that selected tree node is saved to $scope."TREE ID".currentNode. By using $watch, the controller can recognize the tree selection.
+
+
+```javascript
+$scope.$watch( 'abc.currentNode', function( newObj, oldObj ) {
+    if( $scope.abc && angular.isObject($scope.abc.currentNode) ) {
+        console.log( 'Node Selected!!' );
+        console.log( $scope.abc.currentNode );
+    }
+}, false);
+```
+
+## Examples
+
+#### Basic example
+[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/jsfiddle01.png)](http://jsfiddle.net/eu81273/8LWUc/)
+
+[jsFiddle - http://jsfiddle.net/eu81273/8LWUc/](http://jsfiddle.net/eu81273/8LWUc/)
+
+#### Multiple treeview example
+[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/jsfiddle02.png)](http://jsfiddle.net/eu81273/b9Pnw/)
+
+[jsFiddle - http://jsfiddle.net/eu81273/b9Pnw/](http://jsfiddle.net/eu81273/b9Pnw/)
+
+## Browser Compatibility
+
+Same with AngularJS. Safari, Chrome, Firefox, Opera, IE8, IE9 and mobile browsers (Android, Chrome Mobile, iOS Safari).
+
+## Changelogs
+
+#### version 0.1.6
+- Fixed the bug that 'null' string appears before each 'div' generated. (Thanks to Iaac)
+
+#### version 0.1.5
+- support multiple treeview. (Thanks to Axel Pesme)
+
+#### version 0.1.4
+- prevented memory leaks.
+
+#### version 0.1.3
+- removed unnecessary codes.
+
+#### version 0.1.2
+- removed some jQuery dependency. (Issue #2)
+
+## License
+
+The MIT License.
+
+Copyright ⓒ 2013 AHN JAE-HA.
+
+See [LICENSE](https://github.com/eu81273/angular.treeview/blob/master/LICENSE)
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/version.txt b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/version.txt
new file mode 100755
index 0000000..e1df5de
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/angular/version.txt
@@ -0,0 +1 @@
+1.4.4
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload.js
new file mode 100644
index 0000000..0daaa69
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload.js
@@ -0,0 +1,156 @@
+/**!
+ * AngularJS file upload/drop directive with http post and progress
+ * @author  Danial  <danial.farid@gmail.com>
+ * @version 1.1.10
+ */
+(function() {
+	
+var angularFileUpload = angular.module('angularFileUpload', []);
+
+angularFileUpload.service('$upload', ['$http', '$rootScope', '$timeout', function($http, $rootScope, $timeout) {
+	this.upload = function(config) {
+		config.method = config.method || 'POST';
+		config.headers = config.headers || {};
+		config.headers['Content-Type'] = undefined;
+		config.transformRequest = config.transformRequest || $http.defaults.transformRequest;
+		var formData = new FormData();
+		if (config.data) {
+			for (var key in config.data) {
+				var val = config.data[key];
+				if (!config.formDataAppender) {
+					if (typeof config.transformRequest == 'function') {
+						val = config.transformRequest(val);
+					} else {
+						for (var i = 0; i < config.transformRequest.length; i++) {
+							var fn = config.transformRequest[i];
+							if (typeof fn == 'function') {
+								val = fn(val);
+							}
+						}
+					}
+					formData.append(key, val);
+				} else {
+					config.formDataAppender(formData, key, val);
+				}
+			}
+		}
+		config.transformRequest =  angular.identity;
+		formData.append(config.fileFormDataName || 'file', config.file, config.file.name);
+
+		formData['__setXHR_'] = function(xhr) {
+			config.__XHR = xhr;
+			xhr.upload.addEventListener('progress', function(e) {
+				if (config.progress) {
+					$timeout(function() {
+						config.progress(e);
+					});
+				}
+			}, false);
+			//fix for firefox not firing upload progress end
+			xhr.upload.addEventListener('load', function(e) {
+				if (e.lengthComputable) {
+					$timeout(function() {
+						config.progress(e);
+					});
+				}
+			}, false);
+		};
+
+		config.data = formData;
+		
+		var promise = $http(config);
+		
+		promise.progress = function(fn) {
+			config.progress = fn;
+			return promise;
+		};
+		
+		promise.abort = function() {
+			if (config.__XHR) {
+				$timeout(function() {
+					config.__XHR.abort();
+				});
+			}
+			return promise;
+		};		
+		promise.then = (function(promise, origThen) {
+			return function(s, e, p) {
+				config.progress = p || config.progress;
+				origThen.apply(promise, [s, e, p]);
+				return promise;
+			};
+		})(promise, promise.then);
+		
+		return promise;
+	};
+}]);
+
+angularFileUpload.directive('ngFileSelect', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {
+	return function(scope, elem, attr) {
+		var fn = $parse(attr['ngFileSelect']);
+		elem.bind('change', function(evt) {
+			var files = [], fileList, i;
+			fileList = evt.target.files;
+			if (fileList != null) {
+				for (i = 0; i < fileList.length; i++) {
+					files.push(fileList.item(i));
+				}
+			}
+			$timeout(function() {
+				fn(scope, {
+					$files : files,
+					$event : evt
+				});
+			});
+		});
+		elem.bind('click', function(){
+			this.value = null;
+		});
+	};
+} ]);
+
+angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {
+	return function(scope, elem, attr) {
+		if ('draggable' in document.createElement('span')) {
+			var fn = $parse(attr['ngFileDropAvailable']);
+			$timeout(function() {
+				fn(scope);
+			});
+		}
+	};
+} ]);
+
+angularFileUpload.directive('ngFileDrop', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {
+	return function(scope, elem, attr) {
+		if ('draggable' in document.createElement('span')) {
+			var fn = $parse(attr['ngFileDrop']);
+			elem[0].addEventListener("dragover", function(evt) {
+				evt.stopPropagation();
+				evt.preventDefault();
+				elem.addClass(attr['ngFileDragOverClass'] || "dragover");
+			}, false);
+			elem[0].addEventListener("dragleave", function(evt) {
+				elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
+			}, false);
+			elem[0].addEventListener("drop", function(evt) {
+				evt.stopPropagation();
+				evt.preventDefault();
+				elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
+				var files = [], fileList = evt.dataTransfer.files, i;
+				if (fileList != null) {
+					for (i = 0; i < fileList.length; i++) {
+						files.push(fileList.item(i));
+					}
+				}
+				$timeout(function() {
+					fn(scope, {
+						$files : files,
+						$event : evt
+					});
+				});
+			}, false);
+		}
+	};
+} ]);
+
+})();
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload.min.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload.min.js
new file mode 100644
index 0000000..ae51b1f
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload.min.js
@@ -0,0 +1,2 @@
+/*! 1.1.10 */
+!function(){var a=angular.module("angularFileUpload",[]);a.service("$upload",["$http","$rootScope","$timeout",function(a,b,c){this.upload=function(b){b.method=b.method||"POST",b.headers=b.headers||{},b.headers["Content-Type"]=void 0,b.transformRequest=b.transformRequest||a.defaults.transformRequest;var d=new FormData;if(b.data)for(var e in b.data){var f=b.data[e];if(b.formDataAppender)b.formDataAppender(d,e,f);else{if("function"==typeof b.transformRequest)f=b.transformRequest(f);else for(var g=0;g<b.transformRequest.length;g++){var h=b.transformRequest[g];"function"==typeof h&&(f=h(f))}d.append(e,f)}}b.transformRequest=angular.identity,d.append(b.fileFormDataName||"file",b.file,b.file.name),d.__setXHR_=function(a){b.__XHR=a,a.upload.addEventListener("progress",function(a){b.progress&&c(function(){b.progress(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&c(function(){b.progress(a)})},!1)},b.data=d;var i=a(b);return i.progress=function(a){return b.progress=a,i},i.abort=function(){return b.__XHR&&c(function(){b.__XHR.abort()}),i},i.then=function(a,c){return function(d,e,f){return b.progress=f||b.progress,c.apply(a,[d,e,f]),a}}(i,i.then),i}}]),a.directive("ngFileSelect",["$parse","$http","$timeout",function(a,b,c){return function(b,d,e){var f=a(e.ngFileSelect);d.bind("change",function(a){var d,e,g=[];if(d=a.target.files,null!=d)for(e=0;e<d.length;e++)g.push(d.item(e));c(function(){f(b,{$files:g,$event:a})})}),d.bind("click",function(){this.value=null})}}]),a.directive("ngFileDropAvailable",["$parse","$http","$timeout",function(a,b,c){return function(b,d,e){if("draggable"in document.createElement("span")){var f=a(e.ngFileDropAvailable);c(function(){f(b)})}}}]),a.directive("ngFileDrop",["$parse","$http","$timeout",function(a,b,c){return function(b,d,e){if("draggable"in document.createElement("span")){var f=a(e.ngFileDrop);d[0].addEventListener("dragover",function(a){a.stopPropagation(),a.preventDefault(),d.addClass(e.ngFileDragOverClass||"dragover")},!1),d[0].addEventListener("dragleave",function(){d.removeClass(e.ngFileDragOverClass||"dragover")},!1),d[0].addEventListener("drop",function(a){a.stopPropagation(),a.preventDefault(),d.removeClass(e.ngFileDragOverClass||"dragover");var g,h=[],i=a.dataTransfer.files;if(null!=i)for(g=0;g<i.length;g++)h.push(i.item(g));c(function(){f(b,{$files:h,$event:a})})},!1)}}}])}();
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.js
new file mode 100644
index 0000000..16ef155
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.js
@@ -0,0 +1,25 @@
+/**!
+ * AngularJS file upload shim for angular XHR HTML5 browsers
+ * @author  Danial  <danial.farid@gmail.com>
+ * @version 1.1.10
+ */
+if (window.XMLHttpRequest) {
+        if (window.FormData) {
+                // allow access to Angular XHR private field: https://github.com/angular/angular.js/issues/1934
+                XMLHttpRequest = (function(origXHR) {
+                        return function() {
+                                var xhr = new origXHR();
+                                xhr.send = (function(orig) {
+                                        return function() {
+                                                if (arguments[0] instanceof FormData && arguments[0].__setXHR_) {
+                                                        var formData = arguments[0];
+                                                        formData.__setXHR_(xhr);
+                                                }
+                                                orig.apply(xhr, arguments);
+                                        }
+                                })(xhr.send);
+                                return xhr;
+                        }
+                })(XMLHttpRequest);
+        }
+}
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-shim.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-shim.js
new file mode 100644
index 0000000..f526e58
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-shim.js
@@ -0,0 +1,215 @@
+/**!
+ * AngularJS file upload shim for HTML5 FormData
+ * @author  Danial  <danial.farid@gmail.com>
+ * @version 1.1.10
+ */
+(function() {
+
+if (window.XMLHttpRequest) {
+	if (window.FormData) {
+		// allow access to Angular XHR private field: https://github.com/angular/angular.js/issues/1934
+		XMLHttpRequest = (function(origXHR) {
+			return function() {
+				var xhr = new origXHR();
+				xhr.send = (function(orig) {
+					return function() {
+						if (arguments[0] instanceof FormData && arguments[0].__setXHR_) {
+							var formData = arguments[0];
+							formData.__setXHR_(xhr);
+						}
+						orig.apply(xhr, arguments);
+					}
+				})(xhr.send);
+				return xhr;
+			}
+		})(XMLHttpRequest);
+	} else {
+		XMLHttpRequest = (function(origXHR) {
+			return function() {
+				var xhr = new origXHR();
+				var origSend = xhr.send;
+				xhr.__requestHeaders = [];
+				xhr.open = (function(orig) {
+					xhr.upload = {
+						addEventListener: function(t, fn, b) {
+							if (t == 'progress') {
+								xhr.__progress = fn;
+							}
+						}
+					};
+					return function(m, url, b) {
+						orig.apply(xhr, [m, url, b]);
+						xhr.__url = url;
+					}
+				})(xhr.open);
+				xhr.getResponseHeader = (function(orig) {
+					return function(h) {
+						return xhr.__fileApiXHR ? xhr.__fileApiXHR.getResponseHeader(h) : orig.apply(xhr, [h]); 
+					}
+				})(xhr.getResponseHeader);
+				xhr.getAllResponseHeaders = (function(orig) {
+					return function() {
+						return xhr.__fileApiXHR ? xhr.__fileApiXHR.getAllResponseHeaders() : orig.apply(xhr); 
+					}
+				})(xhr.getAllResponseHeaders);
+				xhr.abort = (function(orig) {
+					return function() {
+						return xhr.__fileApiXHR ? xhr.__fileApiXHR.abort() : (orig == null ? null : orig.apply(xhr)); 
+					}
+				})(xhr.abort);
+				xhr.send = function() {
+					if (arguments[0] != null && arguments[0].__isShim && arguments[0].__setXHR_) {
+						var formData = arguments[0];
+						if (arguments[0].__setXHR_) {
+							var formData = arguments[0];
+							formData.__setXHR_(xhr);
+						}
+						var config = {
+							url: xhr.__url,
+							complete: function(err, fileApiXHR) {
+								Object.defineProperty(xhr, 'status', {get: function() {return fileApiXHR.status}});
+								Object.defineProperty(xhr, 'statusText', {get: function() {return fileApiXHR.statusText}});
+								Object.defineProperty(xhr, 'readyState', {get: function() {return 4}});
+								Object.defineProperty(xhr, 'response', {get: function() {return fileApiXHR.response}});
+								Object.defineProperty(xhr, 'responseText', {get: function() {return fileApiXHR.responseText}});
+								xhr.__fileApiXHR = fileApiXHR;
+								xhr.onreadystatechange();
+							},
+							progress: function(e) {
+								xhr.__progress(e);
+							},
+							headers: xhr.__requestHeaders
+						}
+						config.data = {};
+						config.files = {}
+						for (var i = 0; i < formData.data.length; i++) {
+							var item = formData.data[i];
+							if (item.val != null && item.val.name != null && item.val.size != null && item.val.type != null) {
+								config.files[item.key] = item.val;
+							} else {
+								config.data[item.key] = item.val;
+							}
+						}
+						
+						setTimeout(function() {
+							xhr.__fileApiXHR = FileAPI.upload(config);
+						}, 1);
+					} else {
+						origSend.apply(xhr, arguments);
+					}
+				}
+				return xhr;
+			}
+		})(XMLHttpRequest);
+	}
+}
+
+if (!window.FormData) {
+	var hasFlash = false;
+	try {
+	  var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
+	  if (fo) hasFlash = true;
+	} catch(e) {
+	  if (navigator.mimeTypes["application/x-shockwave-flash"] != undefined) hasFlash = true;
+	}
+	var wrapFileApi = function(elem) {
+		if (!elem.__isWrapped && (elem.getAttribute('ng-file-select') != null || elem.getAttribute('data-ng-file-select') != null)) {
+			var wrap = document.createElement('div');
+			wrap.innerHTML = '<div class="js-fileapi-wrapper" style="position:relative; overflow:hidden"></div>';
+			wrap = wrap.firstChild;
+			var parent = elem.parentNode;
+			parent.insertBefore(wrap, elem);
+			parent.removeChild(elem);
+			wrap.appendChild(elem);
+			if (!hasFlash) {
+				wrap.appendChild(document.createTextNode('Flash is required'));
+			}
+			elem.__isWrapped = true;
+		}
+	};
+	var changeFnWrapper = function(fn) {
+		return function(evt) {
+			var files = FileAPI.getFiles(evt);
+			if (!evt.target) {
+				evt.target = {};
+			}
+			evt.target.files = files;
+			evt.target.files.item = function(i) {
+				return evt.target.files[i] || null;
+			}
+			fn(evt);
+		};
+	};
+	var isFileChange = function(elem, e) {
+		return (e.toLowerCase() === 'change' || e.toLowerCase() === 'onchange') && elem.getAttribute('type') == 'file';
+	}
+	if (HTMLInputElement.prototype.addEventListener) {
+		HTMLInputElement.prototype.addEventListener = (function(origAddEventListener) {
+			return function(e, fn, b, d) {
+				if (isFileChange(this, e)) {
+					wrapFileApi(this);
+					origAddEventListener.apply(this, [e, changeFnWrapper(fn), b, d]); 
+				} else {
+					origAddEventListener.apply(this, [e, fn, b, d]);
+				}
+			}
+		})(HTMLInputElement.prototype.addEventListener);		
+	}
+	if (HTMLInputElement.prototype.attachEvent) {
+		HTMLInputElement.prototype.attachEvent = (function(origAttachEvent) {
+			return function(e, fn) {
+				if (isFileChange(this, e)) {
+					wrapFileApi(this);
+					origAttachEvent.apply(this, [e, changeFnWrapper(fn)]); 
+				} else {
+					origAttachEvent.apply(this, [e, fn]);
+				}
+			}
+		})(HTMLInputElement.prototype.attachEvent);
+	}
+
+	window.FormData = FormData = function() {
+		return {
+			append: function(key, val, name) {
+				this.data.push({
+					key: key,
+					val: val,
+					name: name
+				});
+			},
+			data: [],
+			__isShim: true
+		};
+	};
+	
+	(function () {
+		//load FileAPI
+		if (!window.FileAPI || !FileAPI.upload) {
+			var base = '', script = document.createElement('script'), allScripts = document.getElementsByTagName('script'), i, index, src;
+			if (window.FileAPI && window.FileAPI.jsPath) {
+				base = window.FileAPI.jsPath;
+			} else {
+				for (i = 0; i < allScripts.length; i++) {
+					src = allScripts[i].src;
+					index = src.indexOf('angular-file-upload-shim.js')
+					if (index == -1) {
+						index = src.indexOf('angular-file-upload-shim.min.js');
+					}
+					if (index > -1) {
+						base = src.substring(0, index);
+						break;
+					}
+				}
+			}
+
+			if (!window.FileAPI || FileAPI.staticPath == null) {
+				FileAPI = {
+					staticPath: base
+				}
+			}
+	
+			script.setAttribute('src', base + "FileAPI.min.js");
+			document.getElementsByTagName('head')[0].appendChild(script);
+		}
+	})();
+}})();
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-shim.min.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-shim.min.js
new file mode 100644
index 0000000..e76e175
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/fileupload/angular-file-upload-shim.min.js
@@ -0,0 +1,2 @@
+/*! 1.1.10 */
+!function(){if(window.XMLHttpRequest&&(XMLHttpRequest=window.FormData?function(a){return function(){var b=new a;return b.send=function(a){return function(){if(arguments[0]instanceof FormData&&arguments[0].__setXHR_){var c=arguments[0];c.__setXHR_(b)}a.apply(b,arguments)}}(b.send),b}}(XMLHttpRequest):function(a){return function(){var b=new a,c=b.send;return b.__requestHeaders=[],b.open=function(a){return b.upload={addEventListener:function(a,c){"progress"==a&&(b.__progress=c)}},function(c,d,e){a.apply(b,[c,d,e]),b.__url=d}}(b.open),b.getResponseHeader=function(a){return function(c){return b.__fileApiXHR?b.__fileApiXHR.getResponseHeader(c):a.apply(b,[c])}}(b.getResponseHeader),b.getAllResponseHeaders=function(a){return function(){return b.__fileApiXHR?b.__fileApiXHR.getAllResponseHeaders():a.apply(b)}}(b.getAllResponseHeaders),b.abort=function(a){return function(){return b.__fileApiXHR?b.__fileApiXHR.abort():null==a?null:a.apply(b)}}(b.abort),b.send=function(){if(null!=arguments[0]&&arguments[0].__isShim&&arguments[0].__setXHR_){var a=arguments[0];if(arguments[0].__setXHR_){var a=arguments[0];a.__setXHR_(b)}var d={url:b.__url,complete:function(a,c){Object.defineProperty(b,"status",{get:function(){return c.status}}),Object.defineProperty(b,"statusText",{get:function(){return c.statusText}}),Object.defineProperty(b,"readyState",{get:function(){return 4}}),Object.defineProperty(b,"response",{get:function(){return c.response}}),Object.defineProperty(b,"responseText",{get:function(){return c.responseText}}),b.__fileApiXHR=c,b.onreadystatechange()},progress:function(a){b.__progress(a)},headers:b.__requestHeaders};d.data={},d.files={};for(var e=0;e<a.data.length;e++){var f=a.data[e];null!=f.val&&null!=f.val.name&&null!=f.val.size&&null!=f.val.type?d.files[f.key]=f.val:d.data[f.key]=f.val}setTimeout(function(){b.__fileApiXHR=FileAPI.upload(d)},1)}else c.apply(b,arguments)},b}}(XMLHttpRequest)),!window.FormData){var a=!1;try{var b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");b&&(a=!0)}catch(c){void 0!=navigator.mimeTypes["application/x-shockwave-flash"]&&(a=!0)}var d=function(b){if(!b.__isWrapped&&(null!=b.getAttribute("ng-file-select")||null!=b.getAttribute("data-ng-file-select"))){var c=document.createElement("div");c.innerHTML='<div class="js-fileapi-wrapper" style="position:relative; overflow:hidden"></div>',c=c.firstChild;var d=b.parentNode;d.insertBefore(c,b),d.removeChild(b),c.appendChild(b),a||c.appendChild(document.createTextNode("Flash is required")),b.__isWrapped=!0}},e=function(a){return function(b){var c=FileAPI.getFiles(b);b.target||(b.target={}),b.target.files=c,b.target.files.item=function(a){return b.target.files[a]||null},a(b)}},f=function(a,b){return("change"===b.toLowerCase()||"onchange"===b.toLowerCase())&&"file"==a.getAttribute("type")};HTMLInputElement.prototype.addEventListener&&(HTMLInputElement.prototype.addEventListener=function(a){return function(b,c,g,h){f(this,b)?(d(this),a.apply(this,[b,e(c),g,h])):a.apply(this,[b,c,g,h])}}(HTMLInputElement.prototype.addEventListener)),HTMLInputElement.prototype.attachEvent&&(HTMLInputElement.prototype.attachEvent=function(a){return function(b,c){f(this,b)?(d(this),a.apply(this,[b,e(c)])):a.apply(this,[b,c])}}(HTMLInputElement.prototype.attachEvent)),window.FormData=FormData=function(){return{append:function(a,b,c){this.data.push({key:a,val:b,name:c})},data:[],__isShim:!0}},function(){if(!window.FileAPI||!FileAPI.upload){var a,b,c,d="",e=document.createElement("script"),f=document.getElementsByTagName("script");if(window.FileAPI&&window.FileAPI.jsPath)d=window.FileAPI.jsPath;else for(a=0;a<f.length;a++)if(c=f[a].src,b=c.indexOf("angular-file-upload-shim.js"),-1==b&&(b=c.indexOf("angular-file-upload-shim.min.js")),b>-1){d=c.substring(0,b);break}window.FileAPI&&null!=FileAPI.staticPath||(FileAPI={staticPath:d}),e.setAttribute("src",d+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(e)}}()}}();
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.eot b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.eot
new file mode 100755
index 0000000..2b74b9e
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.eot differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.ttf b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.ttf
new file mode 100755
index 0000000..6f3e05b
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.ttf differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.woff b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.woff
new file mode 100755
index 0000000..13f1e19
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.woff differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-114-precomposed.png b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-114-precomposed.png
new file mode 100755
index 0000000..33e71cd
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-114-precomposed.png differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-144-precomposed.png b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-144-precomposed.png
new file mode 100755
index 0000000..31fa91e
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-144-precomposed.png differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-57-precomposed.png b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-57-precomposed.png
new file mode 100755
index 0000000..81db002
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-57-precomposed.png differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-72-precomposed.png b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-72-precomposed.png
new file mode 100755
index 0000000..ec4e1d4
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/apple-touch-icon-72-precomposed.png differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand.png b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand.png
new file mode 100644
index 0000000..441627e
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand.png differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand.svg b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand.svg
new file mode 100644
index 0000000..81cfe50
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="270px" height="10px" viewBox="0 0 270 10" enable-background="new 0 0 270 10" xml:space="preserve">
+<g>
+	<g>
+		<path fill="#FFFFFF" d="M121.965,9.413h-4.883V0.656h4.883v0.903h-3.862V4.38h3.63v0.898h-3.63V8.5h3.862V9.413z"/>
+		<path fill="#FFFFFF" d="M130.988,9.413h-1.158l-4.789-7.352h-0.046c0.062,0.864,0.095,1.655,0.095,2.374v4.978h-0.94V0.656h1.15
+			l4.774,7.317h0.045c-0.006-0.107-0.022-0.453-0.051-1.041c-0.028-0.582-0.039-0.998-0.028-1.254V0.656h0.951v8.753h-0.003V9.413
+			L130.988,9.413z"/>
+		<path fill="#FFFFFF" d="M136.339,9.413h-1.018V1.561h-2.771V0.656h6.564v0.903h-2.771v7.852h-0.002v0.002H136.339z"/>
+		<path fill="#FFFFFF" d="M145.554,9.413h-4.877V0.656h4.877v0.903h-3.859V4.38h3.631v0.898h-3.631V8.5h3.859V9.413z"/>
+		<path fill="#FFFFFF" d="M148.761,5.769v3.641h-1.018V0.656h2.402c1.074,0,1.865,0.204,2.379,0.614
+			c0.514,0.412,0.771,1.032,0.771,1.858c0,1.156-0.586,1.94-1.764,2.349l2.383,3.934h-1.207l-2.121-3.645h-1.826V5.769
+			L148.761,5.769z M148.761,4.897h1.396c0.719,0,1.244-0.142,1.582-0.428c0.334-0.286,0.504-0.714,0.504-1.285
+			c0-0.582-0.17-0.997-0.512-1.254c-0.34-0.255-0.889-0.381-1.643-0.381h-1.324v3.349h-0.004V4.897z"/>
+		<path fill="#FFFFFF" d="M161.124,3.209c0,0.884-0.301,1.567-0.904,2.046c-0.605,0.477-1.475,0.714-2.6,0.714h-1.031v3.444h-1.016
+			V0.656h2.27C160.03,0.656,161.124,1.504,161.124,3.209z M156.589,5.092h0.92c0.898,0,1.555-0.146,1.959-0.435
+			c0.4-0.293,0.604-0.759,0.604-1.404c0-0.577-0.188-1.006-0.568-1.295c-0.381-0.279-0.973-0.423-1.773-0.423h-1.139v3.557H156.589z
+			"/>
+		<path fill="#FFFFFF" d="M164.22,5.769v3.641h-1.02V0.656h2.402c1.074,0,1.865,0.204,2.383,0.614
+			c0.512,0.412,0.771,1.032,0.771,1.858c0,1.156-0.588,1.94-1.762,2.349l2.379,3.934h-1.205l-2.119-3.645h-1.826v0.002H164.22z
+			 M164.22,4.897h1.395c0.719,0,1.244-0.142,1.582-0.428c0.334-0.286,0.504-0.714,0.504-1.285c0-0.582-0.17-0.997-0.51-1.254
+			c-0.34-0.255-0.887-0.381-1.645-0.381h-1.322v3.349h-0.004V4.897z"/>
+		<path fill="#FFFFFF" d="M171.03,9.413V0.656h1.018v8.753h-1.018V9.413z"/>
+		<path fill="#FFFFFF" d="M179.636,7.081c0,0.773-0.281,1.374-0.838,1.805c-0.561,0.434-1.318,0.646-2.277,0.646
+			c-1.039,0-1.836-0.134-2.395-0.4V8.147c0.357,0.152,0.75,0.272,1.174,0.357c0.422,0.088,0.844,0.131,1.258,0.131
+			c0.68,0,1.188-0.129,1.531-0.384c0.346-0.257,0.514-0.62,0.514-1.073c0-0.304-0.061-0.556-0.184-0.748
+			c-0.119-0.194-0.318-0.375-0.607-0.537c-0.285-0.162-0.721-0.351-1.301-0.558c-0.816-0.29-1.398-0.636-1.748-1.036
+			c-0.352-0.398-0.525-0.92-0.525-1.562c0-0.674,0.254-1.211,0.764-1.611c0.508-0.398,1.178-0.599,2.014-0.599
+			c0.869,0,1.672,0.161,2.398,0.48l-0.316,0.884c-0.725-0.3-1.428-0.454-2.109-0.454c-0.539,0-0.959,0.114-1.266,0.347
+			c-0.303,0.231-0.453,0.553-0.453,0.965c0,0.305,0.057,0.551,0.168,0.745c0.115,0.195,0.303,0.372,0.566,0.533
+			c0.268,0.161,0.672,0.34,1.221,0.535c0.92,0.327,1.551,0.679,1.896,1.056C179.462,5.995,179.636,6.483,179.636,7.081z"/>
+		<path fill="#FFFFFF" d="M186.556,9.413h-4.881V0.656h4.881v0.903h-3.863V4.38h3.633v0.898h-3.633V8.5h3.863V9.413z"/>
+		<path fill="#FFFFFF" d="M197.677,9.413l-1.09-2.785h-3.51l-1.078,2.785h-1.031l3.463-8.793h0.854l3.443,8.793H197.677z
+			 M196.267,5.71l-1.018-2.712c-0.131-0.345-0.271-0.766-0.406-1.263c-0.09,0.383-0.211,0.804-0.377,1.263l-1.031,2.712H196.267z"/>
+		<path fill="#FFFFFF" d="M205.733,3.209c0,0.884-0.303,1.567-0.908,2.046c-0.607,0.477-1.473,0.714-2.596,0.714h-1.031v3.444
+			h-1.021V0.656h2.273C204.642,0.656,205.733,1.504,205.733,3.209z M201.2,5.092h0.914c0.902,0,1.557-0.146,1.961-0.435
+			c0.398-0.293,0.605-0.759,0.605-1.404c0-0.577-0.189-1.006-0.57-1.295c-0.381-0.279-0.969-0.423-1.773-0.423H201.2V5.092
+			L201.2,5.092z"/>
+		<path fill="#FFFFFF" d="M213.366,3.209c0,0.884-0.307,1.567-0.908,2.046c-0.607,0.477-1.473,0.714-2.598,0.714h-1.031v3.444h-1.02
+			V0.656h2.271C212.269,0.656,213.366,1.504,213.366,3.209z M208.827,5.092h0.918c0.904,0,1.559-0.146,1.959-0.435
+			c0.404-0.293,0.604-0.759,0.604-1.404c0-0.577-0.188-1.006-0.566-1.295c-0.381-0.279-0.971-0.423-1.773-0.423h-1.141V5.092
+			L208.827,5.092z"/>
+		<path fill="#FFFFFF" d="M215.44,9.413V0.656h1.021v7.832h3.857V9.41h-4.879V9.413z"/>
+		<path fill="#FFFFFF" d="M222.052,9.413V0.656h1.021v8.753h-1.021V9.413z"/>
+		<path fill="#FFFFFF" d="M229.466,1.44c-0.959,0-1.721,0.32-2.279,0.959c-0.557,0.642-0.834,1.518-0.834,2.633
+			c0,1.146,0.27,2.031,0.807,2.656c0.537,0.621,1.303,0.937,2.299,0.937c0.611,0,1.309-0.108,2.09-0.327v0.891
+			c-0.605,0.229-1.355,0.343-2.244,0.343c-1.289,0-2.285-0.396-2.988-1.181c-0.699-0.776-1.051-1.891-1.051-3.333
+			c0-0.902,0.17-1.69,0.506-2.371c0.336-0.678,0.824-1.202,1.461-1.569s1.387-0.551,2.248-0.551c0.918,0,1.719,0.168,2.408,0.504
+			l-0.432,0.875C230.798,1.594,230.13,1.44,229.466,1.44z"/>
+		<path fill="#FFFFFF" d="M239.204,9.413l-1.09-2.785h-3.512l-1.074,2.785h-1.031l3.459-8.793h0.857l3.445,8.793H239.204z
+			 M237.798,5.71l-1.018-2.712c-0.133-0.345-0.27-0.766-0.406-1.263c-0.088,0.383-0.215,0.804-0.377,1.263l-1.033,2.712H237.798z"/>
+		<path fill="#FFFFFF" d="M244.401,9.413h-1.016V1.561h-2.773V0.656h6.564v0.903h-2.771v7.852h-0.004V9.413z"/>
+		<path fill="#FFFFFF" d="M248.743,9.413V0.656h1.018v8.753h-1.018V9.413z"/>
+		<path fill="#FFFFFF" d="M260.005,5.021c0,1.402-0.354,2.503-1.062,3.305c-0.707,0.806-1.691,1.206-2.955,1.206
+			c-1.291,0-2.285-0.396-2.988-1.186c-0.699-0.789-1.051-1.901-1.051-3.338c0-1.424,0.354-2.532,1.057-3.312
+			c0.699-0.785,1.703-1.18,2.99-1.18c1.262,0,2.24,0.399,2.951,1.2C259.655,2.513,260.005,3.614,260.005,5.021z M253.03,5.021
+			c0,1.186,0.25,2.085,0.754,2.697c0.508,0.613,1.242,0.922,2.203,0.922c0.973,0,1.705-0.311,2.201-0.918
+			c0.494-0.615,0.738-1.516,0.738-2.702c0-1.179-0.244-2.072-0.736-2.681c-0.49-0.61-1.223-0.914-2.189-0.914
+			c-0.969,0-1.705,0.306-2.213,0.918C253.282,2.96,253.03,3.851,253.03,5.021z"/>
+		<path fill="#FFFFFF" d="M269.044,9.413h-1.162l-4.783-7.352h-0.049c0.061,0.864,0.094,1.655,0.094,2.374v4.978H262.2V0.656h1.152
+			l4.771,7.319h0.049c-0.012-0.108-0.025-0.455-0.055-1.041c-0.027-0.582-0.041-0.998-0.029-1.256V0.656h0.951v8.755h0.006v0.002
+			H269.044z"/>
+	</g>
+	<g>
+		<path fill="#FFFFFF" d="M7.533,3.368c0,1.013-0.298,1.796-0.896,2.348C6.04,6.269,5.191,6.544,4.093,6.544H3.403v3.008H0.954
+			V0.485h3.139c1.145,0,2.005,0.25,2.58,0.75C7.246,1.736,7.533,2.447,7.533,3.368z M3.403,4.547h0.447
+			c0.368,0,0.66-0.103,0.877-0.31s0.326-0.492,0.326-0.856c0-0.612-0.339-0.918-1.018-0.918H3.403V4.547z"/>
+		<path fill="#FFFFFF" d="M17.652,9.552l-0.446-1.699h-2.944l-0.459,1.699h-2.691l2.958-9.104h3.268l2.995,9.104H17.652z
+			 M16.697,5.843l-0.39-1.489c-0.092-0.33-0.202-0.758-0.333-1.283c-0.13-0.525-0.216-0.901-0.257-1.128
+			c-0.037,0.211-0.111,0.558-0.221,1.042c-0.108,0.483-0.353,1.437-0.729,2.857H16.697z"/>
+		<path fill="#FFFFFF" d="M28.423,9.552h-2.449V2.488H23.76V0.485h6.871v2.003h-2.208V9.552z"/>
+		<path fill="#FFFFFF" d="M39.037,9.552h-2.449V2.488h-2.214V0.485h6.871v2.003h-2.208V9.552z"/>
+		<path fill="#FFFFFF" d="M51.035,9.552h-5.382V0.485h5.382V2.45h-2.933v1.427h2.716v1.966h-2.716v1.711h2.933V9.552z"/>
+		<path fill="#FFFFFF" d="M58.184,6.253v3.299h-2.449V0.485h2.97c2.464,0,3.696,0.893,3.696,2.679c0,1.05-0.513,1.862-1.538,2.437
+			l2.642,3.951h-2.777l-1.922-3.299H58.184z M58.184,4.41h0.459c0.855,0,1.284-0.378,1.284-1.135c0-0.625-0.42-0.937-1.26-0.937
+			h-0.483V4.41z"/>
+		<path fill="#FFFFFF" d="M76.072,9.552H72.86L69.55,3.164h-0.057c0.079,1.004,0.118,1.771,0.118,2.301v4.086h-2.17V0.485h3.2
+			l3.299,6.301h0.037c-0.059-0.914-0.086-1.648-0.086-2.202V0.485h2.183v9.066H76.072z"/>
+		<path fill="#FFFFFF" d="M83.557,9.552h-2.412V0.485h5.356V2.45h-2.944v1.73h2.716v1.965h-2.716V9.552z"/>
+		<path fill="#FFFFFF" d="M91.102,9.552V0.485h2.449v7.088h3.49v1.979H91.102z"/>
+		<path fill="#FFFFFF" d="M104.842,3.846l1.562-3.361h2.654l-2.983,5.525v3.541h-2.468V6.085l-2.983-5.6h2.667L104.842,3.846z"/>
+	</g>
+</g>
+</svg>
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand-lg.png b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand-lg.png
new file mode 100644
index 0000000..a80972e
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/brand-lg.png differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/favicon.ico b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/favicon.ico
new file mode 100644
index 0000000..43c8163
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/favicon.ico differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/logo.png b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/logo.png
new file mode 100755
index 0000000..a45b112
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/logo.png differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/logo.svg b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/logo.svg
new file mode 100755
index 0000000..b9ce0ac
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/logo.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="73px" height="69px" viewBox="0 0 73 69" enable-background="new 0 0 73 69" xml:space="preserve">
+<g>
+	<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="36.2046" y1="2.1504" x2="36.2046" y2="68.6623">
+		<stop  offset="0" style="stop-color:#60EFFF"/>
+		<stop  offset="1" style="stop-color:#1F89C7"/>
+	</linearGradient>
+	<path fill="url(#SVGID_1_)" d="M36.287,0.137l0.008-0.063l-0.031,0.039l-0.012-0.012L36.262,0l-0.057,0.056L36.148,0l0.011,0.101
+		l-0.013,0.012l-0.03-0.039l0.007,0.063L0,35.447l14.307,20.267l11.05-2.538l10.848,15.255l10.85-15.255l11.05,2.538l8.861-12.554
+		l5.444-7.713L36.287,0.137z M35.108,4.282L30.174,50.52l-9.642-13.151L35.108,4.282z M20.059,36.725l-6.068-8.277L35.057,2.683
+		L20.059,36.725z M29.967,51.407l-4.313,0.99l-7.251-10.193l1.807-4.104L29.967,51.407z M36.092,2.051l0.113-0.258l0.114,0.257
+		l5.102,49.711l-0.015-0.01l-4.999,7.387l-5.409-7.396l-0.007,0.004L36.092,2.051z M42.237,50.521L37.303,4.281l14.576,33.087
+		L42.237,50.521z M52.201,38.101l1.808,4.104l-7.251,10.193l-4.312-0.99L52.201,38.101z M37.355,2.684L58.42,28.448l-6.067,8.277
+		L37.355,2.684z M14.605,54.935L0.907,35.53L32.779,4.374L13.114,28.425l6.623,9.03l-2.127,4.83l7.312,10.28L14.605,54.935z
+		 M36.205,67.235L26.086,53.009l4.326-0.992l0.072,0.099l-0.045,0.034l5.988,8.191l5.552-8.201l-0.048-0.032L42,52.017l4.324,0.992
+		L36.205,67.235z M66.4,42.762l-8.594,12.173l-10.317-2.369l7.312-10.28l-2.127-4.83l6.622-9.03L39.633,4.374L71.504,35.53
+		L66.4,42.762z"/>
+</g>
+</svg>
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner.gif b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner.gif
new file mode 100644
index 0000000..4c9ea91
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner.gif differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner-lg.gif b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner-lg.gif
new file mode 100644
index 0000000..0effa66
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner-lg.gif differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner-sm.gif b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner-sm.gif
new file mode 100644
index 0000000..eeaddc2
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/img/spinner-sm.gif differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/js/patternfly.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/js/patternfly.js
new file mode 100644
index 0000000..7e45a6a
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/js/patternfly.js
@@ -0,0 +1,212 @@
+// PatternFly Namespace
+var PatternFly = PatternFly || {};
+
+// Util: PatternFly Sidebar 
+// Set height of sidebar-pf to height of document minus height of navbar-pf if not mobile
+(function($) {
+  sidebar = function() {
+    var documentHeight = 0;
+    var navbarpfHeight = 0;
+    var colHeight = 0;
+    if ( $('.navbar-pf .navbar-toggle').is(':hidden') ) {
+      documentHeight = $(document).height();
+      navbarpfHeight = $('.navbar-pf').outerHeight();
+      colHeight = documentHeight - navbarpfHeight;
+    }
+    $('.sidebar-pf').parent('.row').children('[class*="col-"]').css({ "min-height":colHeight});
+  }
+  $(document).ready(function() {
+    // Call sidebar() on ready if .sidebar-pf exists and .datatable does not exist
+    if ($('.sidebar-pf').length > 0 && $('.datatable').length == 0) {
+      sidebar();
+    }
+  });
+  $(window).resize(function() {
+    // Call sidebar() on resize if .sidebar-pf exists
+    if ($('.sidebar-pf').length > 0) {
+      sidebar();
+    }
+  });
+})(jQuery);
+
+// Util: PatternFly Popovers
+// Add data-close="true" to insert close X icon
+(function($) {
+  PatternFly.popovers = function( selector ) {
+    var allpopovers = $(selector);
+    
+    // Initialize
+    allpopovers.popover();
+    
+    // Add close icons
+    allpopovers.filter('[data-close=true]').each(function(index, element) {
+      var $this = $(element),
+        title = $this.attr('data-original-title') + '<button type="button" class="close" aria-hidden="true"><span class="pficon pficon-close"></span></button>';
+
+      $this.attr('data-original-title', title);
+    });
+    
+    // Bind Close Icon to Toggle Display
+    allpopovers.on('click', function(e) {
+      var $this = $(this);
+        $title = $this.next('.popover').find('.popover-title');
+      
+      // Only if data-close is true add class "x" to title for right padding
+      $title.find('.close').parent('.popover-title').addClass('closable');
+      
+      // Bind x icon to close popover
+      $title.find('.close').on('click', function() {
+        $this.popover('toggle');
+      });
+      
+      // Prevent href="#" page scroll to top
+      e.preventDefault();
+    });
+  };
+})(jQuery);
+
+
+// Util: DataTables Settings
+(function($) {
+  if ($.fn.dataTableExt) {
+    /* Set the defaults for DataTables initialisation */
+    $.extend( true, $.fn.dataTable.defaults, {
+      "bDestroy": true,
+      "bAutoWidth": false,
+      "iDisplayLength": 20,
+      "sDom": 
+        "<'dataTables_header' f i r >" + 
+        "<'table-responsive'  t >" + 
+        "<'dataTables_footer' p >",
+      "oLanguage": {
+        "sInfo": "Showing <b>_START_</b> to <b>_END_</b> of <b>_TOTAL_</b> Items",
+        "sInfoFiltered" : "(of <b>_MAX_</b>)",
+        "sInfoEmpty" : "Showing <b>0</b> Results",
+        "sZeroRecords": 
+          "<p>Suggestions</p>" + 
+          "<ul>" + 
+            "<li>Check the syntax of the search term.</li>" +
+            "<li>Check that the correct menu option is chosen (token ID vs. user ID).</li>" +
+            "<li>Use wildcards (* to match zero or more characters or ? to match a single character).</li>" +
+            "<li>Clear the search field, then click Search to return to the 20 most recent records.</li>" +
+          "</ul>",
+        "sSearch": ""
+      },
+      "sPaginationType": "bootstrap_input"
+    });
+
+    /* Default class modification */
+    $.extend( $.fn.dataTableExt.oStdClasses, {
+      "sWrapper": "dataTables_wrapper"
+    });
+
+    /* API method to get paging information */
+    $.fn.dataTableExt.oApi.fnPagingInfo = function ( oSettings ) {
+      return {
+        "iStart":         oSettings._iDisplayStart,
+        "iEnd":           oSettings.fnDisplayEnd(),
+        "iLength":        oSettings._iDisplayLength,
+        "iTotal":         oSettings.fnRecordsTotal(),
+        "iFilteredTotal": oSettings.fnRecordsDisplay(),
+        "iPage":          oSettings._iDisplayLength === -1 ?
+          0 : Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ),
+        "iTotalPages":    oSettings._iDisplayLength === -1 ?
+          0 : Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength )
+      };
+    };
+
+    /* Combination of Bootstrap + Input Text style pagination control */
+    $.extend( $.fn.dataTableExt.oPagination, {
+      "bootstrap_input": {
+        "fnInit": function( oSettings, nPaging, fnDraw ) {
+          var oLang = oSettings.oLanguage.oPaginate;
+          var fnClickHandler = function ( e ) {
+            e.preventDefault();
+            if ( oSettings.oApi._fnPageChange(oSettings, e.data.action) ) {
+              fnDraw( oSettings );
+            }
+          };
+
+          $(nPaging).append(
+            '<ul class="pagination">'+
+              '<li class="first disabled"><span class="i fa fa-angle-double-left"></span></li>' +
+              '<li class="prev disabled"><span class="i fa fa-angle-left"></span></li>' +
+            '</ul>' + 
+            '<div class="pagination-input">' + 
+              '<input type="text" class="paginate_input">' + 
+              '<span class="paginate_of">of <b>3</b></span>' + 
+            '</div>' + 
+            '<ul class="pagination">'+
+              '<li class="next disabled"><span class="i fa fa-angle-right"></span></li>' +
+              '<li class="last disabled"><span class="i fa fa-angle-double-right"></span></li>' +
+            '</ul>'
+          );
+          
+          var els = $('li', nPaging);
+          $(els[0]).bind( 'click.DT', { action: "first" }, fnClickHandler );
+          $(els[1]).bind( 'click.DT', { action: "previous" }, fnClickHandler );
+          $(els[2]).bind( 'click.DT', { action: "next" }, fnClickHandler );
+          $(els[3]).bind( 'click.DT', { action: "last" }, fnClickHandler );
+          
+          var nInput = $('input', nPaging);
+          $(nInput).keyup( function (e) {
+              if ( e.which == 38 || e.which == 39 ) {
+                this.value++;
+              }
+              else if ( (e.which == 37 || e.which == 40) && this.value > 1 ) {
+                this.value--;
+              }
+                
+              if ( this.value == "" || this.value.match(/[^0-9]/) ) {
+                /* Nothing entered or non-numeric character */
+                return;
+              }
+                
+              var iNewStart = oSettings._iDisplayLength * (this.value - 1);
+              if ( iNewStart > oSettings.fnRecordsDisplay() ) {
+                /* Display overrun */
+                oSettings._iDisplayStart = (Math.ceil((oSettings.fnRecordsDisplay()-1) /
+                  oSettings._iDisplayLength)-1) * oSettings._iDisplayLength;
+                fnDraw( oSettings );
+                return;
+              }
+                
+              oSettings._iDisplayStart = iNewStart;
+              fnDraw( oSettings );
+          });
+        },
+
+        "fnUpdate": function ( oSettings, fnDraw ) {
+          var oPaging = oSettings.oInstance.fnPagingInfo(),
+            an = oSettings.aanFeatures.p,
+            i,
+            ien,
+            iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength),
+            iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
+
+          for ( i=0, ien=an.length ; i<ien ; i++ ) {
+            $('.paginate_input').val(iCurrentPage);
+            $('.paginate_of b').html(iPages);
+            
+            // Add / remove disabled classes from the static elements
+            if ( oPaging.iPage === 0 ) {
+              $('li.first', an[i]).addClass('disabled');
+              $('li.prev', an[i]).addClass('disabled');
+            } else {
+              $('li.first', an[i]).removeClass('disabled');
+              $('li.prev', an[i]).removeClass('disabled');
+            }
+
+            if ( oPaging.iPage === oPaging.iTotalPages-1 || oPaging.iTotalPages === 0 ) {
+              $('li.next', an[i]).addClass('disabled');
+              $('li.last', an[i]).addClass('disabled');
+            } else {
+              $('li.next', an[i]).removeClass('disabled');
+              $('li.last', an[i]).removeClass('disabled');
+            }
+          }
+        }
+      }
+    });
+  }
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/js/patternfly.min.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/js/patternfly.min.js
new file mode 100644
index 0000000..aa2b820
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/patternfly/js/patternfly.min.js
@@ -0,0 +1 @@
+var PatternFly=PatternFly||{};!function($){sidebar=function(){var documentHeight=0,navbarpfHeight=0,colHeight=0;$(".navbar-pf .navbar-toggle").is(":hidden")&&(documentHeight=$(document).height(),navbarpfHeight=$(".navbar-pf").outerHeight(),colHeight=documentHeight-navbarpfHeight),$(".sidebar-pf").parent(".row").children('[class*="col-"]').css({"min-height":colHeight})},$(document).ready(function(){$(".sidebar-pf").length>0&&0==$(".datatable").length&&sidebar()}),$(window).resize(function(){$(".sidebar-pf").length>0&&sidebar()})}(jQuery),function($){PatternFly.popovers=function(selector){var allpopovers=$(selector);allpopovers.popover(),allpopovers.filter("[data-close=true]").each(function(index,element){var $this=$(element),title=$this.attr("data-original-title")+'<button type="button" class="close" aria-hidden="true"><span class="pficon pficon-close"></span></button>';$this.attr("data-original-title",title)}),allpopovers.on("click",function(e){var $this=$(this);$title=$this.next(".popover").find(".popover-title"),$title.find(".close").parent(".popover-title").addClass("closable"),$title.find(".close").on("click",function(){$this.popover("toggle")}),e.preventDefault()})}}(jQuery),function($){$.fn.dataTableExt&&($.extend(!0,$.fn.dataTable.defaults,{bDestroy:!0,bAutoWidth:!1,iDisplayLength:20,sDom:"<'dataTables_header' f i r ><'table-responsive'  t ><'dataTables_footer' p >",oLanguage:{sInfo:"Showing <b>_START_</b> to <b>_END_</b> of <b>_TOTAL_</b> Items",sInfoFiltered:"(of <b>_MAX_</b>)",sInfoEmpty:"Showing <b>0</b> Results",sZeroRecords:"<p>Suggestions</p><ul><li>Check the syntax of the search term.</li><li>Check that the correct menu option is chosen (token ID vs. user ID).</li><li>Use wildcards (* to match zero or more characters or ? to match a single character).</li><li>Clear the search field, then click Search to return to the 20 most recent records.</li></ul>",sSearch:""},sPaginationType:"bootstrap_input"}),$.extend($.fn.dataTableExt.oStdClasses,{sWrapper:"dataTables_wrapper"}),$.fn.dataTableExt.oApi.fnPagingInfo=function(oSettings){return{iStart:oSettings._iDisplayStart,iEnd:oSettings.fnDisplayEnd(),iLength:oSettings._iDisplayLength,iTotal:oSettings.fnRecordsTotal(),iFilteredTotal:oSettings.fnRecordsDisplay(),iPage:-1===oSettings._iDisplayLength?0:Math.ceil(oSettings._iDisplayStart/oSettings._iDisplayLength),iTotalPages:-1===oSettings._iDisplayLength?0:Math.ceil(oSettings.fnRecordsDisplay()/oSettings._iDisplayLength)}},$.extend($.fn.dataTableExt.oPagination,{bootstrap_input:{fnInit:function(oSettings,nPaging,fnDraw){var fnClickHandler=(oSettings.oLanguage.oPaginate,function(e){e.preventDefault(),oSettings.oApi._fnPageChange(oSettings,e.data.action)&&fnDraw(oSettings)});$(nPaging).append('<ul class="pagination"><li class="first disabled"><span class="i fa fa-angle-double-left"></span></li><li class="prev disabled"><span class="i fa fa-angle-left"></span></li></ul><div class="pagination-input"><input type="text" class="paginate_input"><span class="paginate_of">of <b>3</b></span></div><ul class="pagination"><li class="next disabled"><span class="i fa fa-angle-right"></span></li><li class="last disabled"><span class="i fa fa-angle-double-right"></span></li></ul>');var els=$("li",nPaging);$(els[0]).bind("click.DT",{action:"first"},fnClickHandler),$(els[1]).bind("click.DT",{action:"previous"},fnClickHandler),$(els[2]).bind("click.DT",{action:"next"},fnClickHandler),$(els[3]).bind("click.DT",{action:"last"},fnClickHandler);var nInput=$("input",nPaging);$(nInput).keyup(function(e){if(38==e.which||39==e.which?this.value++:(37==e.which||40==e.which)&&this.value>1&&this.value--,""!=this.value&&!this.value.match(/[^0-9]/)){var iNewStart=oSettings._iDisplayLength*(this.value-1);if(iNewStart>oSettings.fnRecordsDisplay())return oSettings._iDisplayStart=(Math.ceil((oSettings.fnRecordsDisplay()-1)/oSettings._iDisplayLength)-1)*oSettings._iDisplayLength,void fnDraw(oSettings);oSettings._iDisplayStart=iNewStart,fnDraw(oSettings)}})},fnUpdate:function(oSettings){var i,ien,oPaging=oSettings.oInstance.fnPagingInfo(),an=oSettings.aanFeatures.p,iPages=Math.ceil(oSettings.fnRecordsDisplay()/oSettings._iDisplayLength),iCurrentPage=Math.ceil(oSettings._iDisplayStart/oSettings._iDisplayLength)+1;for(i=0,ien=an.length;ien>i;i++)$(".paginate_input").val(iCurrentPage),$(".paginate_of b").html(iPages),0===oPaging.iPage?($("li.first",an[i]).addClass("disabled"),$("li.prev",an[i]).addClass("disabled")):($("li.first",an[i]).removeClass("disabled"),$("li.prev",an[i]).removeClass("disabled")),oPaging.iPage===oPaging.iTotalPages-1||0===oPaging.iTotalPages?($("li.next",an[i]).addClass("disabled"),$("li.last",an[i]).addClass("disabled")):($("li.next",an[i]).removeClass("disabled"),$("li.last",an[i]).removeClass("disabled"))}}}))}(jQuery);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/LICENSE b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/LICENSE
new file mode 100644
index 0000000..3c98f3d
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2012 Igor Vaynberg
+
+Version: @@ver@@ Timestamp: @@timestamp@@
+
+This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
+General Public License version 2 (the "GPL License"). You may choose either license to govern your
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License at:
+
+http://www.apache.org/licenses/LICENSE-2.0
+http://www.gnu.org/licenses/gpl-2.0.html
+
+Unless required by applicable law or agreed to in writing, software distributed under the Apache License
+or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+either express or implied. See the Apache License and the GPL License for the specific language governing
+permissions and limitations under the Apache License and the GPL License.
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/README.md b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/README.md
new file mode 100644
index 0000000..cb0be3c
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/README.md
@@ -0,0 +1,83 @@
+Select2
+=======
+
+Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
+
+To get started, checkout examples and documentation at http://ivaynberg.github.com/select2
+
+Use cases
+---------
+
+* Enhancing native selects with search.
+* Enhancing native selects with a better multi-select interface.
+* Loading data from JavaScript: easily load items via ajax and have them searchable.
+* Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
+* Tagging: ability to add new items on the fly.
+* Working with large, remote datasets: ability to partially load a dataset based on the search term.
+* Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
+* Templating: support for custom rendering of results and selections.
+
+Browser compatibility
+---------------------
+* IE 8+
+* Chrome 8+
+* Firefox 10+
+* Safari 3+
+* Opera 10.6+
+
+Integrations
+------------
+
+* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
+* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
+* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org))
+* [Django](https://github.com/applegrew/django-select2)
+* [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
+* [Bootstrap](https://github.com/t0m/select2-bootstrap-css) (CSS skin)
+* [Yii](https://github.com/tonybolzan/yii-select2)
+
+Internationalization (i18n)
+---------------------------
+
+Select2 supports multiple languages by simply including the right
+language JS file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.).
+
+Missing a language? Just copy `select2_locale_en.js.template`, translate
+it, and make a pull request back to Select2 here on GitHub.
+
+Bug tracker
+-----------
+
+Have a bug? Please create an issue here on GitHub!
+
+https://github.com/ivaynberg/select2/issues
+
+Mailing list
+------------
+
+Have a question? Ask on our mailing list!
+
+select2@googlegroups.com
+
+https://groups.google.com/d/forum/select2
+
+
+Copyright and license
+---------------------
+
+Copyright 2012 Igor Vaynberg
+
+This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
+General Public License version 2 (the "GPL License"). You may choose either license to govern your
+use of this software only upon the condition that you accept all of the terms of either the Apache
+License or the GPL License.
+
+You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
+
+http://www.apache.org/licenses/LICENSE-2.0
+http://www.gnu.org/licenses/gpl-2.0.html
+
+Unless required by applicable law or agreed to in writing, software distributed under the Apache License
+or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+either express or implied. See the Apache License and the GPL License for the specific language governing
+permissions and limitations under the Apache License and the GPL License.
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/release.sh b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/release.sh
new file mode 100755
index 0000000..0a315ab
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/release.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+set -e
+
+echo -n "Enter the version for this release: "
+
+read ver
+
+if [ ! $ver ]; then 
+	echo "Invalid version."
+	exit
+fi
+
+name="select2"
+js="$name.js"
+mini="$name.min.js"
+css="$name.css"
+release="$name-$ver"
+tag="$ver"
+branch="build-$ver"
+curbranch=`git branch | grep "*" | sed "s/* //"`
+timestamp=$(date)
+tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
+remote="github"
+
+echo "Updating Version Identifiers"
+
+sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i "" component.json select2.jquery.json
+git add component.json
+git add select2.jquery.json
+git commit -m "modified version identifiers in descriptors for release $ver"
+git push
+ 
+git branch "$branch"
+git checkout "$branch"
+
+echo "Tokenizing..."
+
+find . -name "$js" | xargs -I{} sed -e "$tokens" -i "" {} 
+find . -name "$css" | xargs -I{} sed -e "$tokens" -i "" {}
+sed -e "s/latest/$ver/g" -i "" component.json
+
+git add "$js"
+git add "$css"
+
+echo "Minifying..."
+
+echo "/*" > "$mini"
+cat LICENSE | sed "$tokens" >> "$mini"
+echo "*/" >> "$mini"
+
+curl -s \
+	--data-urlencode "js_code@$js" \
+	http://marijnhaverbeke.nl/uglifyjs \
+	>> "$mini"
+
+git add "$mini"
+	
+git commit -m "release $ver"
+
+echo "Tagging..."
+git tag -a "$tag" -m "tagged version $ver"
+git push "$remote" --tags
+
+echo "Cleaning Up..."
+
+git checkout "$curbranch"
+git branch -D "$branch"
+
+echo "Done"
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2.jquery.json b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2.jquery.json
new file mode 100644
index 0000000..af9cab7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2.jquery.json
@@ -0,0 +1,36 @@
+{
+    "name": "select2",
+    "title": "Select2",
+    "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
+    "keywords": [
+        "select",
+        "autocomplete",
+        "typeahead",
+        "dropdown",
+        "multiselect",
+        "tag",
+        "tagging"
+    ],
+    "version": "3.4.1",
+    "author": {
+        "name": "Igor Vaynberg",
+        "url": "https://github.com/ivaynberg"
+    },
+    "licenses": [
+        {
+            "type": "Apache",
+            "url": "http://www.apache.org/licenses/LICENSE-2.0"
+        },
+        {
+            "type": "GPL v2",
+            "url": "http://www.gnu.org/licenses/gpl-2.0.html"
+        }
+    ],
+    "bugs": "https://github.com/ivaynberg/select2/issues",
+    "homepage": "http://ivaynberg.github.com/select2",
+    "docs": "http://ivaynberg.github.com/select2/",
+    "download": "https://github.com/ivaynberg/select2/tags",
+    "dependencies": {
+        "jquery": ">=1.7.1"
+    }
+}
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ar.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ar.js
new file mode 100644
index 0000000..5ce0106
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ar.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Arabic translation.
+ * 
+ * Author: Your Name <amedhat3@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "لا توجد نتائج"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "من فضلك أدخل " + n + " حروف أكثر"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "من فضلك أحذف  " + n + " حروف"; },
+        formatSelectionTooBig: function (limit) { return "يمكنك ان تختار " + limit + " أختيارات فقط"; },
+        formatLoadMore: function (pageNumber) { return "تحمل المذيد من النتائج ..."; },
+        formatSearching: function () { return "جاري البحث ..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ca.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ca.js
new file mode 100644
index 0000000..bdcdaa7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ca.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Catalan translation.
+ * 
+ * Author: David Planella <david.planella@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "No s'ha trobat cap coincidència"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; },
+        formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats..."; },
+        formatSearching: function () { return "S'està cercant..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_cs.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_cs.js
new file mode 100644
index 0000000..b3c748c
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_cs.js
@@ -0,0 +1,49 @@
+/**
+ * Select2 Czech translation.
+ * 
+ * Author: Michal Marek <ahoj@michal-marek.cz>
+ * Author - sklonovani: David Vallner <david@vallner.net>
+ */
+(function ($) {
+    "use strict";
+    // use text for the numbers 2 through 4
+    var smallNumbers = {
+        2: function(masc) { return (masc ? "dva" : "dvě"); },
+        3: function() { return "tři"; },
+        4: function() { return "čtyři"; }
+    }
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Nenalezeny žádné položky"; },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            if (n == 1) {
+                return "Prosím zadejte ještě jeden znak";
+            } else if (n <= 4) {
+                return "Prosím zadejte ještě další "+smallNumbers[n](true)+" znaky";
+            } else {
+                return "Prosím zadejte ještě dalších "+n+" znaků";
+            }
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            if (n == 1) {
+                return "Prosím zadejte o jeden znak méně";
+            } else if (n <= 4) {
+                return "Prosím zadejte o "+smallNumbers[n](true)+" znaky méně";
+            } else {
+                return "Prosím zadejte o "+n+" znaků méně";
+            }
+        },
+        formatSelectionTooBig: function (limit) {
+            if (limit == 1) {
+                return "Můžete zvolit jen jednu položku";
+            } else if (limit <= 4) {
+                return "Můžete zvolit maximálně "+smallNumbers[limit](false)+" položky";
+            } else {
+                return "Můžete zvolit maximálně "+limit+" položek";
+            }
+        },
+        formatLoadMore: function (pageNumber) { return "Načítají se další výsledky..."; },
+        formatSearching: function () { return "Vyhledávání..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_da.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_da.js
new file mode 100644
index 0000000..dbce3e1
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_da.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Danish translation.
+ *
+ * Author: Anders Jenbo <anders@jenbo.dk>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Ingen resultater fundet"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; },
+        formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); },
+        formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; },
+        formatSearching: function () { return "Søger…"; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_de.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_de.js
new file mode 100644
index 0000000..01f94ed
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_de.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 German translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; },
+        formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; },
+        formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse..."; },
+        formatSearching: function () { return "Suche..."; }
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_el.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_el.js
new file mode 100644
index 0000000..65b6e07
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_el.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 <Language> translation.
+ * 
+ * Author: Your Name <your@email>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερους χαρακτήρες" + (n == 1 ? "" : "s"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρες" + (n == 1 ? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμενο" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων..."; },
+        formatSearching: function () { return "Αναζήτηση..."; }
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_en.js.template b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_en.js.template
new file mode 100644
index 0000000..f76b374
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_en.js.template
@@ -0,0 +1,17 @@
+/**
+ * Select2 <Language> translation.
+ * 
+ * Author: Your Name <your@email>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "No matches found"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " more character" + (n == 1 ? "" : "s"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Loading more results..."; },
+        formatSearching: function () { return "Searching..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_es.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_es.js
new file mode 100644
index 0000000..1b0a021
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_es.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Spanish translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "No se encontraron resultados"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor adicione " + n + " caracter" + (n == 1? "" : "es"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor elimine " + n + " caracter" + (n == 1? "" : "es"); },
+        formatSelectionTooBig: function (limit) { return "Solo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Cargando más resultados..."; },
+        formatSearching: function () { return "Buscando..."; }
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_et.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_et.js
new file mode 100644
index 0000000..a4045d2
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_et.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Estonian translation.
+ *
+ * Author: Kuldar Kalvik <kuldar@kalvik.ee>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Tulemused puuduvad"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; },
+        formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; },
+        formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; },
+        formatSearching: function () { return "Otsin.."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_eu.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_eu.js
new file mode 100644
index 0000000..05665f5
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_eu.js
@@ -0,0 +1,43 @@
+/**
+ * Select2 Basque translation.
+ *
+ * Author: Julen Ruiz Aizpuru <julenx at gmail dot com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () {
+          return "Ez da bat datorrenik aurkitu";
+        },
+        formatInputTooShort: function (input, min) {
+          var n = min - input.length;
+          if (n === 1) {
+            return "Idatzi karaktere bat gehiago";
+          } else {
+            return "Idatzi " + n + " karaktere gehiago";
+          }
+        },
+        formatInputTooLong: function (input, max) {
+          var n = input.length - max;
+          if (n === 1) {
+            return "Idatzi karaktere bat gutxiago";
+          } else {
+            return "Idatzi " + n + " karaktere gutxiago";
+          }
+        },
+        formatSelectionTooBig: function (limit) {
+          if (limit === 1 ) {
+            return "Elementu bakarra hauta dezakezu";
+          } else {
+            return limit + " elementu hauta ditzakezu soilik";
+          }
+        },
+        formatLoadMore: function (pageNumber) {
+          return "Emaitza gehiago kargatzen...";
+        },
+        formatSearching: function () {
+          return "Bilatzen...";
+        }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_fi.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_fi.js
new file mode 100644
index 0000000..fa0917f
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_fi.js
@@ -0,0 +1,28 @@
+/**
+ * Select2 Finnish translation
+ */
+(function ($) {
+    "use strict";
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () {
+            return "Ei tuloksia";
+        },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            return "Ole hyvä ja anna " + n + " merkkiä lisää.";
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            return "Ole hyvä ja annar " + n + " merkkiä vähemmän.";
+        },
+        formatSelectionTooBig: function (limit) {
+            return "Voit valita ainoastaan " + limit + " kpl";
+        },
+        formatLoadMore: function (pageNumber) {
+            return "Ladataan lisää tuloksia...";
+        },
+        formatSearching: function () {
+            return "Etsitään...";
+        }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_fr.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_fr.js
new file mode 100644
index 0000000..f8d3e48
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_fr.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 French translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Aucun résultat trouvé"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Merci de saisir " + n + " caractère" + (n == 1? "" : "s") + " de plus"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Merci de supprimer " + n + " caractère" + (n == 1? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires..."; },
+        formatSearching: function () { return "Recherche en cours..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_gl.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_gl.js
new file mode 100644
index 0000000..1017c20
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_gl.js
@@ -0,0 +1,43 @@
+/**
+ * Select2 Galician translation
+ * 
+ * Author: Leandro Regueiro <leandro.regueiro@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () {
+            return "Non se atoparon resultados";
+        },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            if (n === 1) {
+                return "Engada un carácter";
+            } else {
+                return "Engada " + n + " caracteres";
+            }
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            if (n === 1) {
+                return "Elimine un carácter";
+            } else {
+                return "Elimine " + n + " caracteres";
+            }
+        },
+        formatSelectionTooBig: function (limit) {
+            if (limit === 1 ) {
+                return "Só pode seleccionar un elemento";
+            } else {
+                return "Só pode seleccionar " + limit + " elementos";
+            }
+        },
+        formatLoadMore: function (pageNumber) {
+            return "Cargando máis resultados...";
+        },
+        formatSearching: function () {
+            return "Buscando...";
+        }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_he.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_he.js
new file mode 100644
index 0000000..dd72eaa
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_he.js
@@ -0,0 +1,17 @@
+/**
+* Select2 Hebrew translation.
+*
+* Author: Yakir Sitbon <http://www.yakirs.net/>
+*/
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "לא נמצאו התאמות"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; },
+        formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; },
+        formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות..."; },
+        formatSearching: function () { return "מחפש..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_hr.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_hr.js
new file mode 100644
index 0000000..b061540
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_hr.js
@@ -0,0 +1,42 @@
+/**
+ * Select2 Croatian translation.
+ *
+ * Author: Edi Modrić <edi.modric@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    var specialNumbers = {
+        1: function(n) { return (n % 100 != 11 ? "znak" : "znakova"); },
+        2: function(n) { return (n % 100 != 12 ? "znaka" : "znakova"); },
+        3: function(n) { return (n % 100 != 13 ? "znaka" : "znakova"); },
+        4: function(n) { return (n % 100 != 14 ? "znaka" : "znakova"); }
+    };
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Nema rezultata"; },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            var nMod10 = n % 10;
+
+            if (nMod10 > 0 && nMod10 < 5) {
+                return "Unesite još " + n + " " + specialNumbers[nMod10](n);
+            }
+
+            return "Unesite još " + n + " znakova";
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            var nMod10 = n % 10;
+
+            if (nMod10 > 0 && nMod10 < 5) {
+                return "Unesite " + n + " " + specialNumbers[nMod10](n) + " manje";
+            }
+
+            return "Unesite " + n + " znakova manje";
+        },
+        formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; },
+        formatLoadMore: function (pageNumber) { return "Učitavanje rezultata..."; },
+        formatSearching: function () { return "Pretraga..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_hu.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_hu.js
new file mode 100644
index 0000000..572dea9
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_hu.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Hungarian translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Nincs találat."; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " kerekterrel több mint kellene."; },
+        formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; },
+        formatLoadMore: function (pageNumber) { return "Töltés..."; },
+        formatSearching: function () { return "Keresés..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_id.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_id.js
new file mode 100644
index 0000000..59a896a
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_id.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Indonesian translation.
+ * 
+ * Author: Ibrahim Yusuf <ibrahim7usuf@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Tidak ada data yang sesuai"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi" + (n == 1 ? "" : "s"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapus " + n + " huruf" + (n == 1 ? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Mengambil data..."; },
+        formatSearching: function () { return "Mencari..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_is.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_is.js
new file mode 100644
index 0000000..b10073b
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_is.js
@@ -0,0 +1,16 @@
+/**
+ * Select2 Icelandic translation.
+ * 
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Ekkert fannst"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n == 1 ? "" : "i") + " í viðbót"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n == 1 ? "" : "i"); },
+        formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; },
+        formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður..."; }, 
+        formatSearching: function () { return "Leita..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_it.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_it.js
new file mode 100644
index 0000000..98369dd
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_it.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Italian translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Nessuna corrispondenza trovata"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; },
+        formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); },
+        formatLoadMore: function (pageNumber) { return "Caricamento in corso..."; },
+        formatSearching: function () { return "Ricerca..."; }
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ja.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ja.js
new file mode 100644
index 0000000..81106e7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ja.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Japanese translation.
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "該当なし"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; },
+        formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; },
+        formatLoadMore: function (pageNumber) { return "読込中・・・"; },
+        formatSearching: function () { return "検索中・・・"; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ko.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ko.js
new file mode 100644
index 0000000..864906b
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ko.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 <Language> translation.
+ * 
+ * Author: Swen Mun <longfinfunnel@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "결과 없음"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; },
+        formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; },
+        formatLoadMore: function (pageNumber) { return "불러오는 중…"; },
+        formatSearching: function () { return "검색 중…"; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_lt.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_lt.js
new file mode 100644
index 0000000..dbb1f09
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_lt.js
@@ -0,0 +1,29 @@
+/**
+ * Select2 lithuanian translation.
+ * 
+ * Author: CRONUS Karmalakas <cronus dot karmalakas at gmail dot com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Atitikmenų nerasta"; },
+        formatInputTooShort: function (input, min) {
+        	var n = min - input.length,
+        	    suffix = (n % 10 == 1) && (n % 100 != 11) ? 'į' : (((n % 10 >= 2) && ((n % 100 < 10) || (n % 100 >= 20))) ? 'ius' : 'ių');
+        	return "Įrašykite dar " + n + " simbol" + suffix;
+        },
+        formatInputTooLong: function (input, max) {
+        	var n = input.length - max,
+        	    suffix = (n % 10 == 1) && (n % 100 != 11) ? 'į' : (((n % 10 >= 2) && ((n % 100 < 10) || (n % 100 >= 20))) ? 'ius' : 'ių');
+        	return "Pašalinkite " + n + " simbol" + suffix;
+        },
+        formatSelectionTooBig: function (limit) {
+        	var n = limit,
+                suffix = (n % 10 == 1) && (n % 100 != 11) ? 'ą' : (((n % 10 >= 2) && ((n % 100 < 10) || (n % 100 >= 20))) ? 'us' : 'ų');
+        	return "Jūs galite pasirinkti tik " + limit + " element" + suffix;
+        },
+        formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų..."; },
+        formatSearching: function () { return "Ieškoma..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_lv.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_lv.js
new file mode 100644
index 0000000..2c05cfd
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_lv.js
@@ -0,0 +1,16 @@
+/**
+ * Select2 Latvian translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Sakritību nav"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : (/^\d*[1]$/im.test(n)? "u" : "us")); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : (/^\d*[1]$/im.test(n)? "u" : "iem")) + " mazāk"; },
+        formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : (/^\d*[1]$/im.test(limit)? "u" : "us")); },
+        formatLoadMore: function (pageNumber) { return "Datu ielāde..."; },
+        formatSearching: function () { return "Meklēšana..."; }
+    });
+	
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_mk.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_mk.js
new file mode 100644
index 0000000..69e3981
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_mk.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Macedonian translation.
+ * 
+ * Author: Marko Aleksic <psybaron@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Нема пронајдено совпаѓања"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); },
+        formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); },
+        formatLoadMore: function (pageNumber) { return "Вчитување резултати..."; },
+        formatSearching: function () { return "Пребарување..."; }
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_nl.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_nl.js
new file mode 100644
index 0000000..2ee2662
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_nl.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Dutch translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Geen resultaten gevonden"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul " + n + " karakter" + (n == 1? "" : "s") + " meer in"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vul " + n + " karakter" + (n == 1? "" : "s") + " minder in"; },
+        formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; },
+        formatLoadMore: function (pageNumber) { return "Meer resultaten laden..."; },
+        formatSearching: function () { return "Zoeken..."; },
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_no.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_no.js
new file mode 100644
index 0000000..0831360
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_no.js
@@ -0,0 +1,18 @@
+/**
+ * Select2 Norwegian translation.
+ *
+ * Author: Torgeir Veimo <torgeir.veimo@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Ingen treff"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; },
+        formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; },
+        formatLoadMore: function (pageNumber) { return "Laster flere resultater..."; },
+        formatSearching: function () { return "Søker..."; }
+    });
+})(jQuery);
+
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pl.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pl.js
new file mode 100644
index 0000000..1d5b327
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pl.js
@@ -0,0 +1,37 @@
+/**
+ * Select2 Polish translation.
+ * 
+ * Author: Jan Kondratowicz <jan@kondratowicz.pl>
+ */
+(function ($) {
+    "use strict";
+    
+    var pl_suffix = function(n) {
+        if(n == 1) return "";
+        if((n%100 > 1 && n%100 < 5) || (n%100 > 20 && n%10 > 1 && n%10 < 5)) return "i";
+        return "ów";
+    };
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () {
+            return "Brak wyników.";
+        },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            return "Wpisz jeszcze " + n + " znak" + pl_suffix(n) + ".";
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            return "Wpisana fraza jest za długa o " + n + " znak" + pl_suffix(n) + ".";
+        },
+        formatSelectionTooBig: function (limit) {
+            return "Możesz zaznaczyć najwyżej " + limit + " element" + pl_suffix(limit) + ".";
+        },
+        formatLoadMore: function (pageNumber) {
+            return "Ładowanie wyników...";
+        },
+        formatSearching: function () {
+            return "Szukanie...";
+        }
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pt-BR.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pt-BR.js
new file mode 100644
index 0000000..701fb7f
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pt-BR.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Brazilian Portuguese translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Nenhum resultado encontrado"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Informe " + n + " caracter" + (n == 1? "" : "es"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); },
+        formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Carregando mais resultados..."; },
+        formatSearching: function () { return "Buscando..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pt-PT.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pt-PT.js
new file mode 100644
index 0000000..008653e
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_pt-PT.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Portuguese (Portugal) translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Nenhum resultado encontrado"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " caracter" + (n == 1 ? "" : "es"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1 ? "" : "es"); },
+        formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "A carregar mais resultados..."; },
+        formatSearching: function () { return "A pesquisar..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ro.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ro.js
new file mode 100644
index 0000000..88b3ac4
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ro.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Romanian translation.
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Nu a fost găsit nimic"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); },
+        formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); },
+        formatLoadMore: function (pageNumber) { return "Se încarcă..."; },
+        formatSearching: function () { return "Căutare..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ru.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ru.js
new file mode 100644
index 0000000..3da956a
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ru.js
@@ -0,0 +1,15 @@
+/**
+ * Select2 Russian translation
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Совпадений не найдено"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Пожалуйста, введите еще " + n + " символ" + (n == 1 ? "" : ((n > 1)&&(n < 5) ? "а" : "ов")); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Пожалуйста, введите на " + n + " символ" + (n == 1 ? "" : ((n > 1)&&(n < 5)? "а" : "ов")) + " меньше"; },
+        formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit == 1 ? "а" : "ов"); },
+        formatLoadMore: function (pageNumber) { return "Загрузка данных..."; },
+        formatSearching: function () { return "Поиск..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_sk.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_sk.js
new file mode 100644
index 0000000..8d4e46a
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_sk.js
@@ -0,0 +1,48 @@
+/**
+ * Select2 Slovak translation.
+ *
+ * Author: David Vallner <david@vallner.net>
+ */
+(function ($) {
+    "use strict";
+    // use text for the numbers 2 through 4
+    var smallNumbers = {
+        2: function(masc) { return (masc ? "dva" : "dve"); },
+        3: function() { return "tri"; },
+        4: function() { return "štyri"; }
+    }
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Nenašli sa žiadne položky"; },
+        formatInputTooShort: function (input, min) {
+            var n = min - input.length;
+            if (n == 1) {
+                return "Prosím zadajte ešte jeden znak";
+            } else if (n <= 4) {
+                return "Prosím zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky";
+            } else {
+                return "Prosím zadajte ešte ďalších "+n+" znakov";
+            }
+        },
+        formatInputTooLong: function (input, max) {
+            var n = input.length - max;
+            if (n == 1) {
+                return "Prosím zadajte o jeden znak menej";
+            } else if (n <= 4) {
+                return "Prosím zadajte o "+smallNumbers[n](true)+" znaky menej";
+            } else {
+                return "Prosím zadajte o "+n+" znakov menej";
+            }
+        },
+        formatSelectionTooBig: function (limit) {
+            if (limit == 1) {
+                return "Môžete zvoliť len jednu položku";
+            } else if (limit <= 4) {
+                return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky";
+            } else {
+                return "Môžete zvoliť najviac "+limit+" položiek";
+            }
+        },
+        formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky..."; },
+        formatSearching: function () { return "Vyhľadávanie..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_sv.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_sv.js
new file mode 100644
index 0000000..9f09de3
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_sv.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Swedish translation.
+ *
+ * Author: Jens Rantil <jens.rantil@telavox.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Inga träffar"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; },
+        formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; },
+        formatLoadMore: function (pageNumber) { return "Laddar fler resultat..."; },
+        formatSearching: function () { return "Söker..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_tr.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_tr.js
new file mode 100644
index 0000000..b47a2fa
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_tr.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 Turkish translation.
+ * 
+ * Author: Salim KAYABAŞI <salim.kayabasi@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Sonuç bulunamadı"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; },
+        formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; },
+        formatLoadMore: function (pageNumber) { return "Daha fazla..."; },
+        formatSearching: function () { return "Aranıyor..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ua.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ua.js
new file mode 100644
index 0000000..58d31e7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_ua.js
@@ -0,0 +1,17 @@
+/**
+ * Select2 <Language> translation.
+ * 
+ * Author: bigmihail <bigmihail@bigmir.net>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Нічого не знайдено"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length, s = ["", "и", "ів"], p = [2,0,1,1,1,2]; return "Введіть буль ласка ще " + n + " символ" + s[ (n%100>4 && n%100<=20)? 2 : p[Math.min(n%10, 5)] ]; },
+        formatInputTooLong: function (input, max) { var n = input.length - max, s = ["", "и", "ів"], p = [2,0,1,1,1,2]; return "Введіть буль ласка на " + n + " символ" + s[ (n%100>4 && n%100<=20)? 2 : p[Math.min(n%10, 5)] ] + " менше"; },
+        formatSelectionTooBig: function (limit) {var s = ["", "и", "ів"], p = [2,0,1,1,1,2];  return "Ви можете вибрати лише " + limit + " елемент" + s[ (limit%100>4 && limit%100<=20)? 2 : p[Math.min(limit%10, 5)] ]; },
+        formatLoadMore: function (pageNumber) { return "Завантаження даних..."; },
+        formatSearching: function () { return "Пошук..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_vi.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_vi.js
new file mode 100644
index 0000000..0a45dfc
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_vi.js
@@ -0,0 +1,18 @@
+/**
+ * Select2 Vietnamese translation.
+ * 
+ * Author: Long Nguyen <olragon@gmail.com>
+ */
+(function ($) {
+    "use strict";
+
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "Không tìm thấy kết quả"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự" + (n == 1 ? "" : "s"); },
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự" + (n == 1? "" : "s"); },
+        formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " tùy chọn" + (limit == 1 ? "" : "s"); },
+        formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả..."; },
+        formatSearching: function () { return "Đang tìm..."; }
+    });
+})(jQuery);
+
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_zh-CN.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_zh-CN.js
new file mode 100644
index 0000000..49d8e59
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_zh-CN.js
@@ -0,0 +1,14 @@
+/**
+ * Select2 Chinese translation
+ */
+(function ($) {
+    "use strict";
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "没有找到匹配项"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "请再输入" + n + "个字符";},
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "请删掉" + n + "个字符";},
+        formatSelectionTooBig: function (limit) { return "你只能选择最多" + limit + "项"; },
+        formatLoadMore: function (pageNumber) { return "加载结果中..."; },
+        formatSearching: function () { return "搜索中..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_zh-TW.js b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_zh-TW.js
new file mode 100755
index 0000000..3d447d6
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2_locale_zh-TW.js
@@ -0,0 +1,14 @@
+/**
+ * Select2 Traditional Chinese translation
+ */
+(function ($) {
+    "use strict";
+    $.extend($.fn.select2.defaults, {
+        formatNoMatches: function () { return "沒有找到相符的項目"; },
+        formatInputTooShort: function (input, min) { var n = min - input.length; return "請再輸入" + n + "個字元";},
+        formatInputTooLong: function (input, max) { var n = input.length - max; return "請刪掉" + n + "個字元";},
+        formatSelectionTooBig: function (limit) { return "你只能選擇最多" + limit + "項"; },
+        formatLoadMore: function (pageNumber) { return "載入中..."; },
+        formatSearching: function () { return "搜尋中..."; }
+    });
+})(jQuery);
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2-spinner.gif b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2-spinner.gif
new file mode 100644
index 0000000..5b33f7e
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2-spinner.gif differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2x2.png b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2x2.png
new file mode 100644
index 0000000..4bdd5c9
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/select2-3.4.1/select2x2.png differ
diff --git a/themes/src/main/resources/theme/keycloak/common/resources/lib/zocial/zocial-regular-webfont.woff b/themes/src/main/resources/theme/keycloak/common/resources/lib/zocial/zocial-regular-webfont.woff
new file mode 100644
index 0000000..fe5cd39
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/common/resources/lib/zocial/zocial-regular-webfont.woff differ
diff --git a/themes/src/main/resources/theme/keycloak/email/html/email-verification.ftl b/themes/src/main/resources/theme/keycloak/email/html/email-verification.ftl
new file mode 100644
index 0000000..eb7682a
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/html/email-verification.ftl
@@ -0,0 +1,5 @@
+<html>
+<body>
+${msg("emailVerificationBodyHtml",link, linkExpiration, realmName)}
+</body>
+</html>
diff --git a/themes/src/main/resources/theme/keycloak/email/html/event-login_error.ftl b/themes/src/main/resources/theme/keycloak/email/html/event-login_error.ftl
new file mode 100644
index 0000000..d314103
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/html/event-login_error.ftl
@@ -0,0 +1,5 @@
+<html>
+<body>
+${msg("eventLoginErrorBodyHtml",event.date,event.ipAddress)}
+</body>
+</html>
diff --git a/themes/src/main/resources/theme/keycloak/email/html/event-remove_totp.ftl b/themes/src/main/resources/theme/keycloak/email/html/event-remove_totp.ftl
new file mode 100644
index 0000000..91699ea
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/html/event-remove_totp.ftl
@@ -0,0 +1,5 @@
+<html>
+<body>
+${msg("eventRemoveTotpBodyHtml",event.date, event.ipAddress)}
+</body>
+</html>
diff --git a/themes/src/main/resources/theme/keycloak/email/html/event-update_password.ftl b/themes/src/main/resources/theme/keycloak/email/html/event-update_password.ftl
new file mode 100644
index 0000000..8a6da60
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/html/event-update_password.ftl
@@ -0,0 +1,5 @@
+<html>
+<body>
+${msg("eventUpdatePasswordBodyHtml",event.date, event.ipAddress)}
+</body>
+</html>
diff --git a/themes/src/main/resources/theme/keycloak/email/html/event-update_totp.ftl b/themes/src/main/resources/theme/keycloak/email/html/event-update_totp.ftl
new file mode 100644
index 0000000..c0190c7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/html/event-update_totp.ftl
@@ -0,0 +1,5 @@
+<html>
+<body>
+${msg("eventUpdateTotpBodyHtml",event.date, event.ipAddress)}
+</body>
+</html>
diff --git a/themes/src/main/resources/theme/keycloak/email/html/executeActions.ftl b/themes/src/main/resources/theme/keycloak/email/html/executeActions.ftl
new file mode 100755
index 0000000..f75e10f
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/html/executeActions.ftl
@@ -0,0 +1,5 @@
+<html>
+<body>
+${msg("executeActionsBodyHtml",link, linkExpiration, realmName)}
+</body>
+</html>
diff --git a/themes/src/main/resources/theme/keycloak/email/html/password-reset.ftl b/themes/src/main/resources/theme/keycloak/email/html/password-reset.ftl
new file mode 100755
index 0000000..846b45d
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/html/password-reset.ftl
@@ -0,0 +1,5 @@
+<html>
+<body>
+${msg("passwordResetBodyHtml",link, linkExpiration, realmName)}
+</body>
+</html>
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/messages/messages_ca.properties b/themes/src/main/resources/theme/keycloak/email/messages/messages_ca.properties
new file mode 100644
index 0000000..7f8504a
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/messages/messages_ca.properties
@@ -0,0 +1,21 @@
+emailVerificationSubject=Verificaci\u00F3 d''email
+emailVerificationBody=Alg\u00FA ha creat un compte de {2} amb aquesta adre\u00E7a de correu electr\u00F2nic. Si has estat tu, fes clic a l''enlla\u00E7 seg\u00FCent per verificar la teva adre\u00E7a de correu electr\u00F2nic.\n\n{0}\n\nAquest enlla\u00E7 expirar\u00E0 en {1} minuts.\n\nSi tu no has creat aquest compte, simplement ignora aquest missatge.
+emailVerificationBodyHtml=<p>Alg\u00FA ha creat un compte de {2} amb aquesta adre\u00E7a de correu electr\u00F2nic. Si has estat tu, fes clic a l''enlla\u00E7 seg\u00FCent per verificar la teva adre\u00E7a de correu electr\u00F2nic.</p><p><a href=\"{0}\">{0}</a></p><p> Aquest enlla\u00E7 expirar\u00E0 en {1} minuts.</p><p> Si tu no has creat aquest compte, simplement ignora aquest missatge.</p>
+passwordResetSubject=Reinicia contrasenya
+passwordResetBody=Alg\u00FA ha demanat de canviar les credencials del teu compte de {2}. Si has estat tu, fes clic a l''enlla\u00E7 seg\u00FCent per a reiniciar-les.\n\n{0}\n\nAquest enlla\u00E7 expirar\u00E0 en {1} minuts.\n\nSi no vols reiniciar les teves credencials, simplement ignora aquest missatge i no es realitzar\u00E0 cap canvi.
+passwordResetBodyHtml=<p>Alg\u00FA ha demanat de canviar les credencials del teu compte de {2}. Si has estat tu, fes clic a l''enlla\u00E7 seg\u00FCent per a reiniciar-les.</p><p><a href=\"{0}\">{0}</a></p><p>Aquest enlla\u00E7 expirar\u00E0 en {1} minuts.</p><p>Si no vols reiniciar les teves credencials, simplement ignora aquest missatge i no es realitzar\u00E0 cap canvi.</p>
+executeActionsSubject=Actualitza el teu compte
+executeActionsBody=L''administrador ha sol\u00B7licitat que actualitzis el teu compte de {2}. Fes clic a l''enlla\u00E7 inferior per iniciar aquest proc\u00E9s.\n\n{0}\n\nAquest enlla\u00E7 expirar\u00E0 en {1} minutes.\n\nSi no est\u00E0s al tant que l''administrador hagi sol\u00B7licitat aix\u00F2, simplement ignora aquest missatge i no es realitzar\u00E0 cap canvi.
+executeActionsBodyHtml=<p>L''administrador ha sol\u00B7licitat que actualitzis el teu compte de {2}. Fes clic a l''enlla\u00E7 inferior per iniciar aquest proc\u00E9s.</p><p><a href=\"{0}\">{0}</a></p><p>Aquest enlla\u00E7 expirar\u00E0 en {1} minutes.</p><p>Si no est\u00E0s al tant que l''administrador hagi sol\u00B7licitat aix\u00F2, simplement ignora aquest missatge i no es realitzar\u00E0 cap canvi.</p>
+eventLoginErrorSubject=Fallada en l''inici de sessi\u00F3
+eventLoginErrorBody=S''ha detectat un intent d''acc\u00E9s fallit al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.
+eventLoginErrorBodyHtml=<p>S''ha detectat un intent d''acc\u00E9s fallit al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.</p>
+eventRemoveTotpSubject=Esborrat TOTP
+eventRemoveTotpBody=TOTP s''ha eliminat del teu compte el {0} des de {1}. Si no has estat tu, per favor contacta amb l''administrador.
+eventRemoveTotpBodyHtml=<p>TOTP s''ha eliminat del teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador. </ P>
+eventUpdatePasswordSubject=Actualitzaci\u00F3 de contrasenya
+eventUpdatePasswordBody=La teva contrasenya s''ha actualitzat el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.
+eventUpdatePasswordBodyHtml=<p>La teva contrasenya s''ha actualitzat el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.</p>
+eventUpdateTotpSubject=Actualitzaci\u00F3 de TOTP
+eventUpdateTotpBody=TOTP s''ha actualitzat al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.
+eventUpdateTotpBodyHtml=<p>TOTP s''ha actualitzat al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l''administrador.</p>
diff --git a/themes/src/main/resources/theme/keycloak/email/messages/messages_de.properties b/themes/src/main/resources/theme/keycloak/email/messages/messages_de.properties
new file mode 100755
index 0000000..ca5c776
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/messages/messages_de.properties
@@ -0,0 +1,21 @@
+emailVerificationSubject=E-Mail verifizieren
+passwordResetSubject=Passwort zur\u00FCckzusetzen
+passwordResetBody=Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.\n\n{0}\n\nThis link and code will expire within {1} minutes.\n\nIf you don''t want to reset your credentials, just ignore this message and nothing will be changed.
+passwordResetBodyHtml=<p>Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.</p><p><a href="{0}">{0}</a></p><p>This link will expire within {1} minutes.</p><p>If you don''t want to reset your credentials, just ignore this message and nothing will be changed.</p>
+executeActionsSubject=Update Your Account
+executeActionsBody=Your adminstrator has just requested that you update your {2} account. Click on the link below to start this process.\n\n{0}\n\nThis link will expire within {1} minutes.\n\nIf you are unaware that your admin has requested this, just ignore this message and nothing will be changed.
+executeActionsBodyHtml=<p>Your adminstrator has just requested that you update your {2} account.  Click on the link below to start this process.</p><p><a href="{0}">{0}</a></p><p>This link will expire within {1} minutes.</p><p>If you are unaware that your admin has requested this, just ignore this message and nothing will be changed.</p>
+emailVerificationBody=Jemand hat ein {2} Konto mit dieser E-Mail Adresse erstellt. Fall das Sie waren, dann klicken Sie auf den Link um die E-Mail Adresse zu verifizieren.\n\n{0}\n\nDieser Link wird in {1} Minuten ablaufen.\n\nFalls Sie dieses Konto nicht erstellt haben, dann k\u00F6nnen sie diese Nachricht ignorieren.
+emailVerificationBodyHtml=<p>Jemand hat ein {2} Konto mit dieser E-Mail Adresse erstellt. Fall das Sie waren, dann klicken Sie auf den Link um die E-Mail Adresse zu verifizieren.</p><p><a href="{0}">{0}</a></p><p>Dieser Link wird in {1} Minuten ablaufen.</p><p>Falls Sie dieses Konto nicht erstellt haben, dann k\u00F6nnen sie diese Nachricht ignorieren.</p>
+eventLoginErrorSubject=Fehlgeschlagene Anmeldung
+eventLoginErrorBody=Jemand hat um {0} von {1} versucht sich mit ihrem Konto anzumelden. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.
+eventLoginErrorBodyHtml=<p>Jemand hat um {0} von {1} versucht sich mit ihrem Konto anzumelden. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.</p>
+eventRemoveTotpSubject=TOTP Entfernt
+eventRemoveTotpBody=TOTP wurde von ihrem Konto am {0} von {1} entfernt. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.
+eventRemoveTotpBodyHtml=<p>TOTP wurde von ihrem Konto am {0} von {1} entfernt. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.</p>
+eventUpdatePasswordSubject=Passwort Aktualisiert
+eventUpdatePasswordBody=Ihr Passwort wurde am {0} von {1} ge\u00E4ndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.
+eventUpdatePasswordBodyHtml=<p>Ihr Passwort wurde am {0} von {1} ge\u00E4ndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.</p>
+eventUpdateTotpSubject=TOTP Aktualisiert
+eventUpdateTotpBody=TOTP wurde am {0} von {1} ge\u00E4ndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.
+eventUpdateTotpBodyHtml=<p>TOTP wurde am {0} von {1} ge\u00E4ndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.</p>
diff --git a/themes/src/main/resources/theme/keycloak/email/messages/messages_en.properties b/themes/src/main/resources/theme/keycloak/email/messages/messages_en.properties
new file mode 100755
index 0000000..f4a945c
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/messages/messages_en.properties
@@ -0,0 +1,24 @@
+emailVerificationSubject=Verify email
+emailVerificationBody=Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address\n\n{0}\n\nThis link will expire within {1} minutes.\n\nIf you didn''t create this account, just ignore this message.
+emailVerificationBodyHtml=<p>Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address</p><p><a href="{0}">{0}</a></p><p>This link will expire within {1} minutes.</p><p>If you didn''t create this account, just ignore this message.</p>
+identityProviderLinkSubject=Link {0}
+identityProviderLinkBody=Someone wants to link your "{1}" account with "{0}" account of user {2} . If this was you, click the link below to link accounts\n\n{3}\n\nThis link will expire within {4} minutes.\n\nIf you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.
+identityProviderLinkBodyHtml=<p>Someone wants to link your <b>{1}</b> account with <b>{0}</b> account of user {2} . If this was you, click the link below to link accounts</p><p><a href="{3}">{3}</a></p><p>This link will expire within {4} minutes.</p><p>If you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.</p>
+passwordResetSubject=Reset password
+passwordResetBody=Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.\n\n{0}\n\nThis link and code will expire within {1} minutes.\n\nIf you don''t want to reset your credentials, just ignore this message and nothing will be changed.
+passwordResetBodyHtml=<p>Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.</p><p><a href="{0}">{0}</a></p><p>This link will expire within {1} minutes.</p><p>If you don''t want to reset your credentials, just ignore this message and nothing will be changed.</p>
+executeActionsSubject=Update Your Account
+executeActionsBody=Your adminstrator has just requested that you update your {2} account. Click on the link below to start this process.\n\n{0}\n\nThis link will expire within {1} minutes.\n\nIf you are unaware that your admin has requested this, just ignore this message and nothing will be changed.
+executeActionsBodyHtml=<p>Your adminstrator has just requested that you update your {2} account.  Click on the link below to start this process.</p><p><a href="{0}">{0}</a></p><p>This link will expire within {1} minutes.</p><p>If you are unaware that your admin has requested this, just ignore this message and nothing will be changed.</p>
+eventLoginErrorSubject=Login error
+eventLoginErrorBody=A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an admin.
+eventLoginErrorBodyHtml=<p>A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an admin.</p>
+eventRemoveTotpSubject=Remove TOTP
+eventRemoveTotpBody=TOTP was removed from your account on {0} from {1}. If this was not you, please contact an admin.
+eventRemoveTotpBodyHtml=<p>TOTP was removed from your account on {0} from {1}. If this was not you, please contact an admin.</p>
+eventUpdatePasswordSubject=Update password
+eventUpdatePasswordBody=Your password was changed on {0} from {1}. If this was not you, please contact an admin.
+eventUpdatePasswordBodyHtml=<p>Your password was changed on {0} from {1}. If this was not you, please contact an admin.</p>
+eventUpdateTotpSubject=Update TOTP
+eventUpdateTotpBody=TOTP was updated for your account on {0} from {1}. If this was not you, please contact an admin.
+eventUpdateTotpBodyHtml=<p>TOTP was updated for your account on {0} from {1}. If this was not you, please contact an admin.</p>
diff --git a/themes/src/main/resources/theme/keycloak/email/messages/messages_es.properties b/themes/src/main/resources/theme/keycloak/email/messages/messages_es.properties
new file mode 100644
index 0000000..1616014
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/messages/messages_es.properties
@@ -0,0 +1,21 @@
+emailVerificationSubject=Verificaci\u00F3n de email
+emailVerificationBody=Alguien ha creado una cuenta de {2} con esta direcci\u00F3n de email. Si has sido t\u00FA, haz click en el enlace siguiente para verificar tu direcci\u00F3n de email.\n\n{0}\n\nEste enlace expirar\u00E1 en {1} minutos.\n\nSi t\u00FA no has creado esta cuenta, simplemente ignora este mensaje.
+emailVerificationBodyHtml=<p>Alguien ha creado una cuenta de {2} con esta direcci\u00F3n de email. Si has sido t\u00FA, haz click en el enlace siguiente para verificar tu direcci\u00F3n de email.</p><p><a href=\"{0}\">{0}</a></p><p>Este enlace expirar\u00E1 en {1} minutos.</p><p>Si t\u00FA no has creado esta cuenta, simplemente ignora este mensaje.</p>
+passwordResetSubject=Reiniciar contrase\u00F1a
+passwordResetBody=Alguien ha solicitado cambiar las credenciales de tu cuenta de {2}. Si has sido t\u00FA, haz clic en el enlace siguiente para reiniciarlas.\n\n{0}\n\nEste enlace expirar\u00E1 en {1} minutos.\n\nSi no quieres reiniciar tus credenciales, simplemente ignora este mensaje y no se realizar\u00E1 ning\u00FAn cambio.
+passwordResetBodyHtml=<p>Alguien ha solicitado cambiar las credenciales de tu cuenta de {2}. Si has sido t\u00FA, haz clic en el enlace siguiente para reiniciarlas.</p><p><a href=\"{0}\">{0}</a></p><p>Este enlace expirar\u00E1 en {1} minutos.</p><p>Si no quieres reiniciar tus credenciales, simplemente ignora este mensaje y no se realizar\u00E1 ning\u00FAn cambio.</p>
+executeActionsSubject=Actualiza tu cuenta
+executeActionsBody=El administrador ha solicitado que actualices tu cuenta de {2}. Haz clic en el enlace inferior para iniciar este proceso.\n\n{0}\n\nEste enlace expirar\u00E1 en {1} minutes.\n\nSi no est\u00E1s al tanto de que el administrador haya solicitado esto, simplemente ignora este mensaje y no se realizar\u00E1 ning\u00FAn cambio.
+executeActionsBodyHtml=<p>El administrador ha solicitado que actualices tu cuenta de {2}. Haz clic en el enlace inferior para iniciar este proceso.</p><p><a href=\"{0}\">{0}</a></p><p>Este enlace expirar\u00E1 en {1} minutes.</p><p>Si no est\u00E1s al tanto de que el administrador haya solicitado esto, simplemente ignora este mensaje y no se realizar\u00E1 ning\u00FAn cambio.</p>
+eventLoginErrorSubject=Fallo en el inicio de sesi\u00F3n
+eventLoginErrorBody=Se ha detectado un intento de acceso fallido a tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.
+eventLoginErrorBodyHtml=<p>Se ha detectado un intento de acceso fallido a tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.</p>
+eventRemoveTotpSubject=Borrado TOTP
+eventRemoveTotpBody=TOTP fue eliminado de tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.
+eventRemoveTotpBodyHtml=<p>TOTP fue eliminado de tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.</p>
+eventUpdatePasswordSubject=Actualizaci\u00F3n de contrase\u00F1a
+eventUpdatePasswordBody=Tu contrase\u00F1a se ha actualizado el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.
+eventUpdatePasswordBodyHtml=<p>Tu contrase\u00F1a se ha actualizado el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.</p>
+eventUpdateTotpSubject=Actualizaci\u00F3n de TOTP
+eventUpdateTotpBody=TOTP se ha actualizado en tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.
+eventUpdateTotpBodyHtml=<p>TOTP se ha actualizado en tu cuenta el {0} desde {1}. Si no has sido t\u00FA, por favor contacta con el administrador.</p>
diff --git a/themes/src/main/resources/theme/keycloak/email/messages/messages_fr.properties b/themes/src/main/resources/theme/keycloak/email/messages/messages_fr.properties
new file mode 100755
index 0000000..8c66385
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/messages/messages_fr.properties
@@ -0,0 +1,24 @@
+emailVerificationSubject=V\u00e9rification du courriel
+emailVerificationBody=Quelqu''un vient de cr\u00e9er un compte "{2}" avec votre courriel. Si c''est bien vous, veuillez cliquer sur le lien ci-dessous afin de v\u00e9rifier votre adresse de courriel\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSinon ignorer ce message.
+emailVerificationBodyHtml=<p>Quelqu''un a cr\u00e9er un compte "{2}" avec votre courriel. Si c''est bien vous, veuillez cliquer sur le lien ci-dessous afin de v\u00e9rifier votre adresse de courriel</p><p><a href="{0}">{0}</a></p><p>Ce lien expire dans {1} minute(s).</p><p>Sinon veuillez ignorer ce message.</p>
+identityProviderLinkSubject=Link {0}
+identityProviderLinkBody=Someone wants to link your "{1}" account with "{0}" account of user {2} . If this was you, click the link below to link accounts\n\n{3}\n\nThis link will expire within {4} minutes.\n\nIf you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.
+identityProviderLinkBodyHtml=<p>Someone wants to link your <b>{1}</b> account with <b>{0}</b> account of user {2} . If this was you, click the link below to link accounts</p><p><a href="{3}">{3}</a></p><p>This link will expire within {4} minutes.</p><p>If you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.</p>
+passwordResetSubject=R\u00e9initialiser le mot de passe
+passwordResetBody=Quelqu''un vient de demander une r\u00e9initialisation de mot de passe pour votre compte {2}. Si c''est bien vous, veuillez cliquer sur le lien ci-dessous pour le mettre \u00e0 jour .\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSinon ignorer ce message, aucun changement ne sera effectu\u00e9 sur votre compte.
+passwordResetBodyHtml=<p>Quelqu''un vient de demander une reinitialisation de mot de passe pour votre compte {2}. Si c''est bien vous, veuillez cliquer sur le lien ci-dessous pour le mettre \u00e0 jour.</p><p><a href="{0}">{0}</a></p><p>Ce lien expire dans {1} minute(s).</p><p>Sinon ignorer ce message, aucun changement ne sera effectu\u00e9 sur votre compte.</p>
+executeActionsSubject=Mettre \u00e0 jour votre compte
+executeActionsBody=Votre adminitrateur vient de demander une mise \u00e0 jour de votre compte {2}. Veuillez cliquer sur le lien ci-dessous afin commencer le processus.\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSi vous n''\u00eates pas au courant de cette requ\u00eate, ignorer ce message, aucun changement ne sera effectu\u00e9 sur votre compte.
+executeActionsBodyHtml=<p>Votre adminitrateur vient de demander une mise \u00e0 jour de votre compte {2}. Veuillez cliquer sur le lien ci-dessous afin commencer le processus.</p><p><a href="{0}">{0}</a></p><p>Ce lien expire dans {1} minute(s).</p><p>Si vous n''\u00eates pas au courant de cette requ\u00eate, ignorer ce message, aucun changement ne sera effectu\u00e9 sur votre compte.</p>
+eventLoginErrorSubject=Erreur de connexion
+eventLoginErrorBody=Une tentative de connexion a \u00e9t\u00e9 d\u00e9tect\u00e9e sur votre compte sur {0} depuis {1}. Si ce n''est pas vous, veuillez contacter votre administrateur.
+eventLoginErrorBodyHtml=<p>Une tentative de connexion a \u00e9t\u00e9 d\u00e9tect\u00e9e sur votre compte sur {0} depuis {1}. Si ce n''est pas vous, veuillez contacter votre administrateur.</p>
+eventRemoveTotpSubject=Suppression du TOTP
+eventRemoveTotpBody=Le TOTP a \u00e9t\u00e9 supprim\u00e9 de votre compte {0} depuis {1}. Si ce n''est pas vous, veuillez contacter votre administrateur.
+eventRemoveTotpBodyHtml=<p>Le TOTP a \u00e9t\u00e9 supprim\u00e9 de votre compte {0} depuis {1}. Si ce n''est pas vous, veuillez contacter votre administrateur.</p>
+eventUpdatePasswordSubject=Mise \u00e0 jour du mot de passe
+eventUpdatePasswordBody=Votre mot de passe a chang\u00e9 pour votre compte {0} depuis {1}. Si ce n''est pas vous, veuillez contacter votre administrateur.
+eventUpdatePasswordBodyHtml=<p>Votre mot de passe \u00e0 chang\u00e9 pour votre compte {0} depuis {1}. Si ce n''est pas vous, veuillez contacter votre administrateur.</p>
+eventUpdateTotpSubject=Mise \u00e0 jour du TOTP
+eventUpdateTotpBody=Le TOTP a \u00e9t\u00e9 mis \u00e0 jour pour votre compte sur {0} depuis {1}. Si ce n''est pas vous, veuillez contacter votre administrateur.
+eventUpdateTotpBodyHtml=<p>Le TOTP a \u00e9t\u00e9 mis \u00e0 jour pour votre compte sur {0} depuis {1}. Si ce n''est pas vous, veuillez contacter votre administrateur.</p>
diff --git a/themes/src/main/resources/theme/keycloak/email/messages/messages_pt_BR.properties b/themes/src/main/resources/theme/keycloak/email/messages/messages_pt_BR.properties
new file mode 100755
index 0000000..6596fba
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/messages/messages_pt_BR.properties
@@ -0,0 +1,24 @@
+emailVerificationSubject=Verifica\u00E7\u00E3o de e-mail
+emailVerificationBody=Algu\u00E9m criou uma conta {2} com este endere\u00E7o de e-mail. Se foi voc\u00EA, clique no link abaixo para verificar o seu endere\u00E7o de email\n\n{0}\n\nEste link ir\u00E1 expirar dentro de {1} minutos.\n\nSe n\u00E3o foi voc\u00EA que criou esta conta, basta ignorar esta mensagem.
+emailVerificationBodyHtml=<p>Algu\u00E9m criou uma conta {2} com este endere\u00E7o de e-mail. Se foi voc\u00EA, clique no link abaixo para verificar o seu endere\u00E7o de email</p><p><a href="{0}">{0}</a></p><p>Este link ir\u00E1 expirar dentro de {1} minutos.</p><p>Se n\u00E3o foi voc\u00EA que criou esta conta, basta ignorar esta mensagem.</p>
+identityProviderLinkSubject=Vincular {0}
+identityProviderLinkBody=Algu\u00E9m quer vincular sua conta "{1}" com a conta "{0}" do usu\u00E1rio {2} . Se foi voc\u00EA, clique no link abaixo para vincular as contas.\n\n{3}\n\nEste link ir\u00E1 expirar em {4} minutos.\n\nSe voc\u00EA n\u00E3o quer vincular a conta, apenas ignore esta mensagem. Se voc\u00EA vincular as contas, voc\u00EA ser\u00E1 capaz de logar em {1} atr\u00E1v\u00E9s de {0}.
+identityProviderLinkBodyHtml=<p>Algu\u00E9m quer vincular sua conta <b>{1}</b> com a conta <b>{0}</b> do usu\u00E1rio {2} . Se foi voc\u00EA, clique no link abaixo para vincular as contas.</p><p><a href="{3}">{3}</a></p><p>Este link ir\u00E1 expirar em {4} minutos.</p><p>Se voc\u00EA n\u00E3o quer vincular a conta, apenas ignore esta mensagem. Se voc\u00EA vincular as contas, voc\u00EA ser\u00E1 capaz de logar em {1} atr\u00E1v\u00E9s de {0}.</p>
+passwordResetSubject=Redefini\u00E7\u00E3o de senha
+passwordResetBody=Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.\n\n{0}\n\nThis link and code will expire within {1} minutes.\n\nIf you don''t want to reset your credentials, just ignore this message and nothing will be changed.
+passwordResetBodyHtml=<p>Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.</p><p><a href="{0}">{0}</a></p><p>This link will expire within {1} minutes.</p><p>If you don''t want to reset your credentials, just ignore this message and nothing will be changed.</p>
+executeActionsSubject=Update Your Account
+executeActionsBody=Your adminstrator has just requested that you update your {2} account. Click on the link below to start this process.\n\n{0}\n\nThis link will expire within {1} minutes.\n\nIf you are unaware that your admin has requested this, just ignore this message and nothing will be changed.
+executeActionsBodyHtml=<p>Your adminstrator has just requested that you update your {2} account.  Click on the link below to start this process.</p><p><a href="{0}">{0}</a></p><p>This link will expire within {1} minutes.</p><p>If you are unaware that your admin has requested this, just ignore this message and nothing will be changed.</p>
+eventLoginErrorSubject=Erro de login
+eventLoginErrorBody=Uma tentativa de login mal sucedida para a sua conta foi detectada em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.
+eventLoginErrorBodyHtml=<p>Uma tentativa de login mal sucedida para a sua conta foi detectada em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.</p>
+eventRemoveTotpSubject=Remover TOTP
+eventRemoveTotpBody=TOTP foi removido da sua conta em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.
+eventRemoveTotpBodyHtml=<p>TOTP foi removido da sua conta em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.</p>
+eventUpdatePasswordSubject=Atualiza\u00E7\u00E3o de senha
+eventUpdatePasswordBody=Sua senha foi alterada em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.
+eventUpdatePasswordBodyHtml=<p>Sua senha foi alterada em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.</p>
+eventUpdateTotpSubject=Atualiza\u00E7\u00E3o TOTP
+eventUpdateTotpBody=TOTP foi atualizado para a sua conta em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.
+eventUpdateTotpBodyHtml=<p>TOTP foi atualizado para a sua conta em {0} de {1}. Se n\u00E3o foi voc\u00EA, por favor, entre em contato com um administrador.</p>
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/text/email-verification.ftl b/themes/src/main/resources/theme/keycloak/email/text/email-verification.ftl
new file mode 100644
index 0000000..0ae601f
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/text/email-verification.ftl
@@ -0,0 +1 @@
+${msg("emailVerificationBody",link, linkExpiration, realmName)}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/text/event-login_error.ftl b/themes/src/main/resources/theme/keycloak/email/text/event-login_error.ftl
new file mode 100644
index 0000000..7835c91
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/text/event-login_error.ftl
@@ -0,0 +1 @@
+${msg("eventLoginErrorBody",event.date,event.ipAddress)}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/text/event-remove_totp.ftl b/themes/src/main/resources/theme/keycloak/email/text/event-remove_totp.ftl
new file mode 100644
index 0000000..8930b64
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/text/event-remove_totp.ftl
@@ -0,0 +1 @@
+${msg("eventRemoveTotpBody",event.date, event.ipAddress)}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/text/event-update_password.ftl b/themes/src/main/resources/theme/keycloak/email/text/event-update_password.ftl
new file mode 100644
index 0000000..754daac
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/text/event-update_password.ftl
@@ -0,0 +1 @@
+${msg("eventUpdatePasswordBody",event.date, event.ipAddress)}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/text/event-update_totp.ftl b/themes/src/main/resources/theme/keycloak/email/text/event-update_totp.ftl
new file mode 100644
index 0000000..3a7b0f7
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/text/event-update_totp.ftl
@@ -0,0 +1 @@
+${msg("eventUpdateTotpBody",event.date, event.ipAddress)}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/text/executeActions.ftl b/themes/src/main/resources/theme/keycloak/email/text/executeActions.ftl
new file mode 100755
index 0000000..a33758f
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/text/executeActions.ftl
@@ -0,0 +1 @@
+${msg("executeActionsBody",link, linkExpiration, realmName)}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/text/identity-provider-link.ftl b/themes/src/main/resources/theme/keycloak/email/text/identity-provider-link.ftl
new file mode 100644
index 0000000..a8c0d54
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/text/identity-provider-link.ftl
@@ -0,0 +1 @@
+${msg("identityProviderLinkBody", identityProviderAlias, realmName, identityProviderContext.username, link, linkExpiration)}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/email/text/password-reset.ftl b/themes/src/main/resources/theme/keycloak/email/text/password-reset.ftl
new file mode 100755
index 0000000..aba4fd1
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/email/text/password-reset.ftl
@@ -0,0 +1 @@
+${msg("passwordResetBody",link, linkExpiration, realmName)}
\ No newline at end of file
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/css/login.css b/themes/src/main/resources/theme/keycloak/login/resources/css/login.css
new file mode 100644
index 0000000..b45f9b9
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/login/resources/css/login.css
@@ -0,0 +1,305 @@
+.login-pf body {
+    background: #0f0f0f url("../img/keycloak-bg.png") top left no-repeat;
+    background-size: 100% auto;
+}
+
+.alert-error {
+    background-color: #ffffff;
+    border-color: #cc0000;
+    color: #333333;
+}
+
+#kc-locale ul {
+    display: none;
+    position: absolute;
+    background-color: #fff;
+    list-style: none;
+    right: 20px;
+    top: 30px;
+    width: 200px;
+    padding: 2px;
+}
+
+#kc-locale:hover ul {
+    display: block;
+    margin: 0;
+}
+
+#kc-locale ul li a {
+    display: block;
+    padding: 1px 11px;
+    color: #000 !important;
+    border: 1px solid #fff;
+    text-decoration: none;
+    display:block;
+    line-height: 20px;
+}
+
+#kc-locale ul li a:hover {
+    color: #4d5258;
+    background-color: #d4edfa;
+    border-color: #b3d3e7;
+}
+
+#kc-locale-dropdown a {
+    color: #fff;
+}
+
+#kc-locale-dropdown a:hover {
+    text-decoration: none;
+}
+
+a#kc-current-locale-link {
+    display: block;
+    padding: 5px;
+}
+
+a#kc-current-locale-link:hover {
+    background-color: rgba(0,0,0,0.2);
+}
+
+a#kc-current-locale-link::after {
+    content: "\2c5";
+    margin-left: 4px;
+}
+
+.login-pf .container {
+    padding-top: 40px;
+}
+
+.login-pf a:hover {
+    color: #0099d3;
+}
+
+#kc-logo {
+    width: 100%;
+}
+
+#kc-logo-wrapper {
+    background-image: url("../img/keycloak-logo.png");
+    background-repeat: no-repeat;
+
+    height: 37px;
+    width: 154px;
+}
+
+#kc-header {
+    color: #fff;
+    overflow: visible;
+    padding-left: 80px;
+    white-space: nowrap;
+}
+
+#kc-header-wrapper {
+    font-size: 26px;
+    text-transform: uppercase;
+    line-height: 1.2em;
+    margin-bottom: 15px;
+}
+
+#kc-content {
+    position: relative;
+}
+
+#kc-content-wrapper {
+    overflow-y: hidden;
+}
+
+#kc-info {
+    padding-bottom: 200px;
+    margin-bottom: -200px;
+}
+
+#kc-info-wrapper {
+    font-size: 13px;
+}
+
+#kc-form-options span {
+    display: block;
+}
+
+#kc-terms-text {
+    margin-bottom: 20px;
+}
+
+#kc-registration {
+    margin-bottom: 15px;
+}
+
+/* TOTP */
+
+ol#kc-totp-settings {
+    margin: 0;
+    padding: 0;
+}
+
+ol#kc-totp-settings li {
+    margin-top: 1em;
+}
+
+ol#kc-totp-settings li:first-of-type {
+    margin-top: 0;
+}
+
+/* OAuth */
+
+#kc-oauth h3 {
+    margin-top: 0;
+}
+
+#kc-oauth ul {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+#kc-oauth ul li {
+    border-top: 1px solid rgba(255, 255, 255, 0.1);
+    font-size: 12px;
+    padding: 10px 30px;
+}
+
+#kc-oauth ul li:first-of-type {
+    border-top: 0;
+}
+
+#kc-oauth .kc-role {
+    display: inline-block;
+    width: 50%;
+}
+
+/* Code */
+#kc-code textarea {
+    width: 100%;
+    height: 8em;
+}
+
+/* Social */
+
+#kc-social-providers ul {
+    padding: 0;
+    margin: 0;
+}
+
+#kc-social-providers li {
+    display: block;
+    margin-top: 5px;
+}
+
+#kc-social-providers li:first-of-type {
+    margin-top: 0;
+}
+
+.zocial {
+    width: 150px;
+}
+
+.zocial:hover {
+    color: #fff !important;
+}
+
+.zocial.facebook,
+.zocial.github,
+.zocial.google,
+.zocial.twitter {
+    background-image: none;
+    border-radius: 2px;
+
+    font-family: "Open Sans", sans-serif;
+    font-weight: normal;
+
+    box-shadow: none;
+    text-shadow: none;
+}
+
+.zocial.google {
+    background-color: #dd4b39 !important;
+}
+.zocial.google .text:after {
+    content: "+";
+}
+
+.zocial.facebook:hover,
+.zocial.github:hover,
+.zocial.google:hover,
+.zocial.twitter:hover {
+    background-image: linear-gradient(rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0.2) 100%) !important;
+}
+
+@media (min-width: 768px) {
+    #kc-container-wrapper {
+        bottom: 13%;
+        position: absolute;
+        width: 100%;
+    }
+
+    #kc-logo-wrapper {
+        position: absolute;
+        top: 50px;
+        right: 50px;
+    }
+
+    .login-pf .container {
+        padding-right: 80px;
+    }
+
+    #kc-locale {
+        position: relative;
+        width: 200px;
+        left: -230px;
+        text-align: right;
+        z-index: 9999;
+    }
+}
+
+@media (max-width: 767px) {
+
+    #kc-logo-wrapper {
+        background-position: center;
+        width: 100%;
+        margin: 20px 0;
+    }
+
+    #kc-header {
+        padding-left: 15px;
+        padding-right: 15px;
+        float: none;
+        text-align: center;
+    }
+
+    #kc-form {
+        float: none;
+    }
+
+    #kc-info-wrapper {
+        border-top: 1px solid rgba(255, 255, 255, 0.1);
+        margin-top: 15px;
+        padding-top: 15px;
+        padding-left: 0px;
+        padding-right: 15px;
+    }
+
+    #kc-social-providers li {
+        display: inline-block;
+        margin-right: 5px;
+    }
+
+    .login-pf .container {
+        padding-top: 15px;
+        padding-bottom: 15px;
+    }
+
+    #kc-locale {
+        position: absolute;
+        width: 200px;
+        top: 10px;
+        right: 0px;
+        text-align: right;
+        z-index: 9999;
+    }
+}
+
+@media (max-height: 500px) {
+    #kc-container-wrapper {
+    }
+}
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/img/favicon.ico b/themes/src/main/resources/theme/keycloak/login/resources/img/favicon.ico
new file mode 100644
index 0000000..b30dce5
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/login/resources/img/favicon.ico differ
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-error-arrow-down.png b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-error-arrow-down.png
new file mode 100644
index 0000000..6f2d9d2
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-error-arrow-down.png differ
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-error-sign.png b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-error-sign.png
new file mode 100644
index 0000000..0dd5004
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-error-sign.png differ
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-success-arrow-down.png b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-success-arrow-down.png
new file mode 100644
index 0000000..03cc0c4
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-success-arrow-down.png differ
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-success-sign.png b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-success-sign.png
new file mode 100644
index 0000000..640bd71
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-success-sign.png differ
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-warning-arrow-down.png b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-warning-arrow-down.png
new file mode 100644
index 0000000..6f2d9d2
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-warning-arrow-down.png differ
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-warning-sign.png b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-warning-sign.png
new file mode 100644
index 0000000..f9392a3
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/login/resources/img/feedback-warning-sign.png differ
diff --git a/themes/src/main/resources/theme/keycloak/login/resources/img/keycloak-logo.png b/themes/src/main/resources/theme/keycloak/login/resources/img/keycloak-logo.png
new file mode 100644
index 0000000..9555748
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/login/resources/img/keycloak-logo.png differ
diff --git a/themes/src/main/resources/theme/keycloak/login/theme.properties b/themes/src/main/resources/theme/keycloak/login/theme.properties
new file mode 100644
index 0000000..8891151
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/login/theme.properties
@@ -0,0 +1,46 @@
+parent=base
+import=common/keycloak
+
+styles=lib/patternfly/css/patternfly.css lib/zocial/zocial.css css/login.css
+meta=viewport==width=device-width,initial-scale=1
+
+kcHtmlClass=login-pf
+
+kcLogoLink=http://www.keycloak.org
+
+kcContentClass=col-sm-12 col-md-12 col-lg-12 container
+kcContentWrapperClass=row
+
+kcHeaderClass=col-xs-12 col-sm-8 col-md-8 col-lg-7
+kcFeedbackAreaClass=col-md-12
+kcLocaleClass=col-xs-12 col-sm-1
+kcAlertIconClasserror=pficon pficon-error-circle-o
+
+kcFormAreaClass=col-xs-12 col-sm-8 col-md-8 col-lg-7 login
+
+kcFeedbackErrorIcon=pficon pficon-error-circle-o
+kcFeedbackWarningIcon=pficon pficon-warning-triangle-o
+kcFeedbackSuccessIcon=alert alert-success
+
+
+kcFormClass=form-horizontal
+kcFormGroupClass=form-group
+kcFormGroupErrorClass=has-error
+kcLabelClass=control-label
+kcLabelWrapperClass=col-xs-12 col-sm-12 col-md-4 col-lg-3
+kcInputClass=form-control
+kcInputWrapperClass=col-xs-12 col-sm-12 col-md-8 col-lg-9
+kcFormOptionsClass=col-xs-4 col-sm-5 col-md-offset-4 col-md-4 col-lg-offset-3 col-lg-5
+kcFormButtonsClass=col-xs-8 col-sm-7 col-md-4 col-lg-4 submit
+kcTextareaClass=form-control
+
+kcInfoAreaClass=col-xs-12 col-sm-4 col-md-4 col-lg-5 details
+
+##### css classes for form buttons
+# main class used for all buttons
+kcButtonClass=btn
+# classes defining priority of the button - primary or default (there is typically only one priority button for the form)
+kcButtonPrimaryClass=btn-primary
+kcButtonDefaultClass=btn-default
+# classes defining size of the button
+kcButtonLargeClass=btn-lg
diff --git a/themes/src/main/resources/theme/keycloak/welcome/index.ftl b/themes/src/main/resources/theme/keycloak/welcome/index.ftl
new file mode 100755
index 0000000..9a6c51c
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/welcome/index.ftl
@@ -0,0 +1,106 @@
+<!--
+  ~ JBoss, Home of Professional Open Source.
+  ~ Copyright (c) 2011, Red Hat, Inc., and individual contributors
+  ~ as indicated by the @author tags. See the copyright.txt file in the
+  ~ distribution for a full listing of individual contributors.
+  ~
+  ~ This is free software; you can redistribute it and/or modify it
+  ~ under the terms of the GNU Lesser General Public License as
+  ~ published by the Free Software Foundation; either version 2.1 of
+  ~ the License, or (at your option) any later version.
+  ~
+  ~ This software is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public
+  ~ License along with this software; if not, write to the Free
+  ~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+  ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+  -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+<head>
+    <title>Welcome to Keycloak</title>
+    <link rel="shortcut icon" href="welcome-content/favicon.ico" type="image/x-icon">
+    <link rel="StyleSheet" href="welcome-content/keycloak.css" type="text/css">
+    <style>
+        label {
+            display: inline-block;
+            width: 200px;
+            text-align: right;
+            margin-right: 10px;
+        }
+
+        button {
+            margin-left: 215px;
+        }
+
+        form {
+            background-color: #eee;
+            border: 1px solid #666;
+            padding-bottom: 1em;
+        }
+
+        .error {
+            color: #a30000;
+        }
+    </style>
+</head>
+
+<body>
+<div class="wrapper">
+    <div class="content">
+        <div class="logo">
+                <img src="welcome-content/keycloak_logo.png" alt="Keycloak" border="0" />
+        </div>
+        <h1>Welcome to Keycloak</h1>
+
+        <#if successMessage?has_content>
+            <p>${successMessage}</p>
+        <#elseif errorMessage?has_content>
+            <p class="error">${errorMessage}</p>
+        <#elseif bootstrap>
+            <#if localUser>
+                <p>Please create an initial admin user to get started.</p>
+            <#else>
+                <p>
+                    You need local access to create the initial admin user. Open <a href="http://localhost:8080/auth">http://localhost:8080/auth</a>
+                    or use the add-user script.
+                </p>
+            </#if>
+        </#if>
+
+        <#if bootstrap && localUser>
+            <form method="post">
+                <p>
+                    <label for="username">Username</label>
+                    <input id="username" name="username" />
+                </p>
+
+                <p>
+                    <label for="password">Password</label>
+                    <input id="password" name="password" type="password" />
+                </p>
+
+                <p>
+                    <label for="passwordConfirmation">Password confirmation</label>
+                    <input id="passwordConfirmation" name="passwordConfirmation" type="password" />
+                </p>
+
+                <button id="create-button" type="submit">Create</button>
+            </form>
+        </#if>
+
+        <p><a href="http://www.keycloak.org/docs">Documentation</a> | <a href="admin/">Administration Console</a> </p>
+
+        <p><a href="http://www.keycloak.org">Keycloak Project</a> |
+            <a href="https://lists.jboss.org/mailman/listinfo/keycloak-user">Mailing List</a> |
+            <a href="https://issues.jboss.org/browse/KEYCLOAK">Report an issue</a></p>
+        <p class="logos"><a href="http://www.jboss.org"><img src="welcome-content/jboss_community.png" alt="JBoss and JBoss Community" width="254" height="31" border="0"></a></p>
+    </div>
+</div>
+</body>
+</html>
diff --git a/themes/src/main/resources/theme/keycloak/welcome/resources/favicon.ico b/themes/src/main/resources/theme/keycloak/welcome/resources/favicon.ico
new file mode 100644
index 0000000..b30dce5
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/welcome/resources/favicon.ico differ
diff --git a/themes/src/main/resources/theme/keycloak/welcome/resources/jboss_community.png b/themes/src/main/resources/theme/keycloak/welcome/resources/jboss_community.png
new file mode 100644
index 0000000..946e8f9
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/welcome/resources/jboss_community.png differ
diff --git a/themes/src/main/resources/theme/keycloak/welcome/resources/keycloak.css b/themes/src/main/resources/theme/keycloak/welcome/resources/keycloak.css
new file mode 100644
index 0000000..5152862
--- /dev/null
+++ b/themes/src/main/resources/theme/keycloak/welcome/resources/keycloak.css
@@ -0,0 +1,65 @@
+/*
+  ~ JBoss, Home of Professional Open Source.
+  ~ Copyright (c) 2011, Red Hat, Inc., and individual contributors
+  ~ as indicated by the @author tags. See the copyright.txt file in the
+  ~ distribution for a full listing of individual contributors.
+  ~
+  ~ This is free software; you can redistribute it and/or modify it
+  ~ under the terms of the GNU Lesser General Public License as
+  ~ published by the Free Software Foundation; either version 2.1 of
+  ~ the License, or (at your option) any later version.
+  ~
+  ~ This software is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public
+  ~ License along with this software; if not, write to the Free
+  ~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+  ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+
+body {
+	/*background: url(bkg.gif) repeat-x;*/
+	color: #5B5B5B;
+	font-family: "Lucida Sans Unicode", "Lucida Grande", Geneva, Verdana, Arial, sans-serif;
+	margin-top: 100px;
+	text-align: center;
+}
+.wrapper {
+	margin-left: auto;
+	margin-right: auto;
+	width: 50em;
+	text-align: left;
+}
+a {
+	text-decoration: none;
+	color: #5e8a9a;
+}
+h1 {
+	padding-top: 20px;
+	color: #7b1e1e;
+}
+a:hover {
+	text-decoration: underline;
+	color: #8ec6d9;
+}
+.content {
+    margin: 0;
+    padding: 0;
+}
+.dualbrand {
+	padding-top: 20px;
+}
+.wildfly {
+	float:left;
+	margin-left: 10px;
+}
+.logo{
+    margin-bottom: 10px;
+}
+.note {
+	font-size: 8pt;
+	color: #aaaaaa;
+}
diff --git a/themes/src/main/resources/theme/keycloak/welcome/resources/keycloak_logo.png b/themes/src/main/resources/theme/keycloak/welcome/resources/keycloak_logo.png
new file mode 100644
index 0000000..1f62687
Binary files /dev/null and b/themes/src/main/resources/theme/keycloak/welcome/resources/keycloak_logo.png differ
diff --git a/wildfly/extensions/pom.xml b/wildfly/extensions/pom.xml
index e0ece0a..555a841 100755
--- a/wildfly/extensions/pom.xml
+++ b/wildfly/extensions/pom.xml
@@ -46,11 +46,6 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
-            <artifactId>keycloak-forms-common-themes</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-services</artifactId>
             <scope>provided</scope>
         </dependency>