keycloak-uncached

Changes

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/com/github/relaxng/main/module.xml 37(+0 -37)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/com/sun/istack/main/module.xml 40(+0 -40)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/com/sun/xml/bind/main/module.xml 47(+0 -47)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/com/sun/xml/txw2/main/module.xml 38(+0 -38)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/com/sun/xsom/main/module.xml 39(+0 -39)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/javax/xml/bind/api/main/module.xml 38(+0 -38)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/apache/commons/codec/main/module.xml 36(+0 -36)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/apache/commons/logging/main/module.xml 25(+0 -25)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/apache/httpcomponents/main/module.xml 42(+0 -42)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/apache/james/mime4j/main/module.xml 38(+0 -38)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/codehaus/jackson/jackson-core-asl/main/module.xml 36(+0 -36)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/codehaus/jackson/jackson-mapper-asl/main/module.xml 38(+0 -38)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/codehaus/jackson/jackson-xc/main/module.xml 40(+0 -40)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/jboss/xnio/netty/netty-xnio-transport/main/module.xml 39(+0 -39)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/joda/time/main/module.xml 34(+0 -34)

distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/slf4j/jcl-over-slf4j/main/module.xml 33(+0 -33)

examples/ldap/embedded-ldap/assembly.xml 21(+0 -21)

examples/ldap/embedded-ldap/pom.xml 77(+0 -77)

examples/ldap/embedded-ldap/src/main/java/org/keycloak/example/ldap/embedded/EmbeddedLDAPLauncher.java 129(+0 -129)

examples/ldap/ldap-app/pom.xml 58(+0 -58)

examples/ldap/pom.xml 87(+77 -10)

pom.xml 46(+6 -40)

Details

diff --git a/connections/jpa/pom.xml b/connections/jpa/pom.xml
index a21451e..d1a77ea 100755
--- a/connections/jpa/pom.xml
+++ b/connections/jpa/pom.xml
@@ -24,7 +24,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java b/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java
index 61bbafa..a79c82b 100755
--- a/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java
+++ b/connections/jpa/src/main/java/org/keycloak/connections/jpa/DefaultJpaConnectionProviderFactory.java
@@ -13,10 +13,12 @@ import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
 import javax.sql.DataSource;
 import java.sql.Connection;
+import java.sql.DatabaseMetaData;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
@@ -29,6 +31,8 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
     private volatile EntityManagerFactory emf;
 
     private Config.Scope config;
+    
+    private Map<String,String> operationalInfo;
 
     @Override
     public JpaConnectionProvider create(KeycloakSession session) {
@@ -120,56 +124,73 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
                     properties.put("hibernate.show_sql", config.getBoolean("showSql", false));
                     properties.put("hibernate.format_sql", config.getBoolean("formatSql", true));
 
-                    if (databaseSchema != null) {
-                        logger.trace("Updating database");
-
-                        JpaUpdaterProvider updater = session.getProvider(JpaUpdaterProvider.class);
-                        if (updater == null) {
-                            throw new RuntimeException("Can't update database: JPA updater provider not found");
-                        }
-
-                        connection = getConnection();
-
-                        if (databaseSchema.equals("update")) {
-                            String currentVersion = null;
-                            try {
-                                ResultSet resultSet = connection.createStatement().executeQuery(updater.getCurrentVersionSql(schema));
-                                if (resultSet.next()) {
-                                    currentVersion = resultSet.getString(1);
-                                }
-                            } catch (SQLException e) {
-                            }
-
-                            if (currentVersion == null || !JpaUpdaterProvider.LAST_VERSION.equals(currentVersion)) {
-                                updater.update(session, connection, schema);
-                            } else {
-                                logger.debug("Database is up to date");
-                            }
-                        } else if (databaseSchema.equals("validate")) {
-                            updater.validate(connection, schema);
-                        } else {
-                            throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema);
-                        }
-
-                        logger.trace("Database update completed");
-                    }
-
-                    logger.trace("Creating EntityManagerFactory");
-                    emf = Persistence.createEntityManagerFactory(unitName, properties);
-                    logger.trace("EntityManagerFactory created");
-
-                    // Close after creating EntityManagerFactory to prevent in-mem databases from closing
-                    if (connection != null) {
-                        try {
-                            connection.close();
-                        } catch (SQLException e) {
-                            logger.warn(e);
-                        }
+                    connection = getConnection();
+                    try{ 
+	                    prepareOperationalInfo(connection);
+	                    
+	                    if (databaseSchema != null) {
+	                        logger.trace("Updating database");
+	
+	                        JpaUpdaterProvider updater = session.getProvider(JpaUpdaterProvider.class);
+	                        if (updater == null) {
+	                            throw new RuntimeException("Can't update database: JPA updater provider not found");
+	                        }
+	
+	                        if (databaseSchema.equals("update")) {
+	                            String currentVersion = null;
+	                            try {
+	                                ResultSet resultSet = connection.createStatement().executeQuery(updater.getCurrentVersionSql(schema));
+	                                if (resultSet.next()) {
+	                                    currentVersion = resultSet.getString(1);
+	                                }
+	                            } catch (SQLException e) {
+	                            }
+	
+	                            if (currentVersion == null || !JpaUpdaterProvider.LAST_VERSION.equals(currentVersion)) {
+	                                updater.update(session, connection, schema);
+	                            } else {
+	                                logger.debug("Database is up to date");
+	                            }
+	                        } else if (databaseSchema.equals("validate")) {
+	                            updater.validate(connection, schema);
+	                        } else {
+	                            throw new RuntimeException("Invalid value for databaseSchema: " + databaseSchema);
+	                        }
+	
+	                        logger.trace("Database update completed");
+	                    }
+	
+	                    logger.trace("Creating EntityManagerFactory");
+	                    emf = Persistence.createEntityManagerFactory(unitName, properties);
+	                    logger.trace("EntityManagerFactory created");
+
+                    } finally {
+	                    // Close after creating EntityManagerFactory to prevent in-mem databases from closing
+	                    if (connection != null) {
+	                        try {
+	                            connection.close();
+	                        } catch (SQLException e) {
+	                            logger.warn(e);
+	                        }
+	                    }
                     }
                 }
             }
         }
     }
+    
+    protected void prepareOperationalInfo(Connection connection) {
+  		try {
+  			operationalInfo = new LinkedHashMap<>();
+  			DatabaseMetaData md = connection.getMetaData();
+  			operationalInfo.put("databaseUrl",md.getURL());
+  			operationalInfo.put("databaseUser", md.getUserName());
+  			operationalInfo.put("databaseProduct", md.getDatabaseProductName() + " " + md.getDatabaseProductVersion());
+  			operationalInfo.put("databaseDriver", md.getDriverName() + " " + md.getDriverVersion());
+  		} catch (SQLException e) {
+  			logger.warn("Unable to prepare operational info due database exception: " + e.getMessage());
+  		}
+  	}
 
     private Connection getConnection() {
         try {
@@ -185,5 +206,10 @@ public class DefaultJpaConnectionProviderFactory implements JpaConnectionProvide
             throw new RuntimeException("Failed to connect to database", e);
         }
     }
+    
+    @Override
+  	public Map<String,String> getOperationalInfo() {
+  		return operationalInfo;
+  	}
 
 }
diff --git a/connections/jpa/src/main/java/org/keycloak/connections/jpa/JpaConnectionProviderFactory.java b/connections/jpa/src/main/java/org/keycloak/connections/jpa/JpaConnectionProviderFactory.java
index 1cf4a5f..288e403 100644
--- a/connections/jpa/src/main/java/org/keycloak/connections/jpa/JpaConnectionProviderFactory.java
+++ b/connections/jpa/src/main/java/org/keycloak/connections/jpa/JpaConnectionProviderFactory.java
@@ -1,9 +1,10 @@
 package org.keycloak.connections.jpa;
 
-import org.keycloak.provider.ProviderFactory;
+import org.keycloak.provider.ServerInfoAwareProviderFactory;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
-public interface JpaConnectionProviderFactory extends ProviderFactory<JpaConnectionProvider> {
+public interface JpaConnectionProviderFactory extends ServerInfoAwareProviderFactory<JpaConnectionProvider> {
+
 }
diff --git a/connections/jpa-liquibase/src/main/java/org/keycloak/connections/jpa/updater/liquibase/custom/JpaUpdate1_4_0_Final.java b/connections/jpa-liquibase/src/main/java/org/keycloak/connections/jpa/updater/liquibase/custom/JpaUpdate1_4_0_Final.java
new file mode 100644
index 0000000..1f60d6b
--- /dev/null
+++ b/connections/jpa-liquibase/src/main/java/org/keycloak/connections/jpa/updater/liquibase/custom/JpaUpdate1_4_0_Final.java
@@ -0,0 +1,54 @@
+package org.keycloak.connections.jpa.updater.liquibase.custom;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import liquibase.datatype.DataTypeFactory;
+import liquibase.exception.CustomChangeException;
+import liquibase.statement.core.InsertStatement;
+import liquibase.statement.core.UpdateStatement;
+import liquibase.structure.core.Table;
+import org.keycloak.models.utils.KeycloakModelUtils;
+
+/**
+ * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
+ */
+public class JpaUpdate1_4_0_Final extends CustomKeycloakTask {
+
+    @Override
+    protected void generateStatementsImpl() throws CustomChangeException {
+        String userAttributeTableName = database.correctObjectName("USER_ATTRIBUTE", Table.class);
+
+        try {
+            PreparedStatement statement = jdbcConnection.prepareStatement("select NAME, USER_ID from USER_ATTRIBUTE");
+
+            try {
+                ResultSet resultSet = statement.executeQuery();
+                try {
+                    while (resultSet.next()) {
+                        String name = resultSet.getString(1);
+                        String userId = resultSet.getString(2);
+
+                        UpdateStatement updateStatement = new UpdateStatement(null, null, userAttributeTableName)
+                                .addNewColumnValue("ID", KeycloakModelUtils.generateId())
+                                .setWhereClause("NAME='" + name + "' AND USER_ID='" + userId + "'");
+                        statements.add(updateStatement);
+                    }
+                } finally {
+                    resultSet.close();
+                }
+            } finally {
+                statement.close();
+            }
+
+            confirmationMessage.append("Updated " + statements.size() + " attributes in USER_ATTRIBUTE table");
+        } catch (Exception e) {
+            throw new CustomChangeException(getTaskId() + ": Exception when updating data from previous version", e);
+        }
+    }
+
+    @Override
+    protected String getTaskId() {
+        return "Update 1.4.0.Final";
+    }
+}
diff --git a/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.4.0.xml b/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.4.0.xml
index 5fc0f23..e32a3c7 100755
--- a/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.4.0.xml
+++ b/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.4.0.xml
@@ -39,7 +39,7 @@
             </column>
         </addColumn>
         <addColumn tableName="USER_ATTRIBUTE">
-            <column name="ID" type="VARCHAR(36)">
+            <column name="ID" type="VARCHAR(36)" defaultValue="sybase-needs-something-here">
                 <constraints nullable="false"/>
             </column>
         </addColumn>
@@ -102,7 +102,7 @@
             <column name="NAME" type="VARCHAR(255)">
                 <constraints nullable="false"/>
             </column>
-            <column name="VALUE" type="VARCHAR(255)"/>
+            <column name="VALUE" type="VARCHAR(2048)"/>
             <column name="CLIENT_SESSION" type="VARCHAR(36)">
                 <constraints nullable="false"/>
             </column>
@@ -132,6 +132,8 @@
             </column>
         </createTable>
 
+        <customChange class="org.keycloak.connections.jpa.updater.liquibase.custom.JpaUpdate1_4_0_Final"/>
+
         <dropPrimaryKey constraintName="CONSTRAINT_6" tableName="USER_ATTRIBUTE"/>
         <addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_USER_ATTRIBUTE_PK" tableName="USER_ATTRIBUTE"/>
         <addPrimaryKey columnNames="ID" constraintName="CONSTRAINT_REQ_ACT_PRV_PK" tableName="REQUIRED_ACTION_PROVIDER"/>
@@ -144,5 +146,11 @@
             <column name="CREATED_TIMESTAMP" type="BIGINT"/>
             <column name="SERVICE_ACCOUNT_CLIENT_LINK" type="VARCHAR(36)"/>
         </addColumn>
+
+        <!-- Sybase specific hacks -->
+        <modifySql dbms="sybase">
+            <replace replace="[USER_ATTRIBUTE] DROP PRIMARY KEY" with="[USER_ATTRIBUTE] DROP CONSTRAINT CONSTRAINT_6" />
+        </modifySql>
+
     </changeSet>
 </databaseChangeLog>
diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/api/types/MapperRegistry.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/api/types/MapperRegistry.java
index bafda1e..90c9355 100755
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/api/types/MapperRegistry.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/api/types/MapperRegistry.java
@@ -47,6 +47,10 @@ public class MapperRegistry {
 
 
     public <S> S convertDBObjectToApplicationObject(MapperContext<Object, S> context) {
+        if (context.getObjectToConvert() == null) {
+            return null;
+        }
+
         Object dbObject = context.getObjectToConvert();
         Class<?> expectedApplicationObjectType = context.getExpectedReturnType();
 
@@ -74,6 +78,10 @@ public class MapperRegistry {
 
 
     public <S> S convertApplicationObjectToDBObject(Object applicationObject, Class<S> expectedDBObjectType) {
+        if (applicationObject == null) {
+            return null;
+        }
+
         Class<?> appObjectType = applicationObject.getClass();
         Mapper<Object, S> mapper = (Mapper<Object, S>)getAppConverterForType(appObjectType, appObjectMappers);
         if (mapper == null) {
diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/DefaultMongoConnectionFactoryProvider.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/DefaultMongoConnectionFactoryProvider.java
index 36be680..8da15b6 100755
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/DefaultMongoConnectionFactoryProvider.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/DefaultMongoConnectionFactoryProvider.java
@@ -5,6 +5,7 @@ import com.mongodb.MongoClient;
 import com.mongodb.MongoClientOptions;
 import com.mongodb.MongoCredential;
 import com.mongodb.ServerAddress;
+
 import org.jboss.logging.Logger;
 import org.keycloak.Config;
 import org.keycloak.connections.mongo.api.MongoStore;
@@ -18,6 +19,8 @@ import javax.net.ssl.SSLSocketFactory;
 import java.lang.reflect.Method;
 import java.net.UnknownHostException;
 import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -57,6 +60,8 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
     private MongoStore mongoStore;
     private DB db;
     protected Config.Scope config;
+    
+    private Map<String,String> operationalInfo;
 
     @Override
     public MongoConnectionProvider create(KeycloakSession session) {
@@ -159,7 +164,13 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
         } else {
             client = new MongoClient(new ServerAddress(host, port), clientOptions);
         }
-
+        
+        operationalInfo = new LinkedHashMap<>();
+        operationalInfo.put("mongoServerAddress", client.getAddress().toString());
+        operationalInfo.put("mongoDatabaseName", dbName);
+        operationalInfo.put("mongoUser", user);
+        operationalInfo.put("mongoDriverVersion", client.getVersion());
+    		
         logger.debugv("Initialized mongo model. host: %s, port: %d, db: %s", host, port, dbName);
         return client;
     }
@@ -206,5 +217,10 @@ public class DefaultMongoConnectionFactoryProvider implements MongoConnectionPro
             }
         }
     }
+    
+    @Override
+  	public Map<String,String> getOperationalInfo() {
+  		return operationalInfo;
+  	}
 
 }
diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/MongoStoreImpl.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/MongoStoreImpl.java
index a496c0b..94049f5 100755
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/MongoStoreImpl.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/MongoStoreImpl.java
@@ -79,9 +79,9 @@ public class MongoStoreImpl implements MongoStore {
         mapperRegistry.addAppObjectMapper(new ListMapper(mapperRegistry, Set.class));
         mapperRegistry.addDBObjectMapper(new BasicDBListToSetMapper(mapperRegistry));
 
-        mapperRegistry.addAppObjectMapper(new MapMapper(HashMap.class));
-        mapperRegistry.addAppObjectMapper(new MapMapper(Map.class));
-        mapperRegistry.addDBObjectMapper(new BasicDBObjectToMapMapper());
+        mapperRegistry.addAppObjectMapper(new MapMapper(mapperRegistry, HashMap.class));
+        mapperRegistry.addAppObjectMapper(new MapMapper(mapperRegistry, Map.class));
+        mapperRegistry.addDBObjectMapper(new BasicDBObjectToMapMapper(mapperRegistry));
 
         // Enum converters
         mapperRegistry.addAppObjectMapper(new EnumToStringMapper());
diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBObjectToMapMapper.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBObjectToMapMapper.java
index 14ada88..316d771 100644
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBObjectToMapMapper.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBObjectToMapMapper.java
@@ -3,31 +3,44 @@ package org.keycloak.connections.mongo.impl.types;
 import com.mongodb.BasicDBObject;
 import org.keycloak.connections.mongo.api.types.Mapper;
 import org.keycloak.connections.mongo.api.types.MapperContext;
+import org.keycloak.connections.mongo.api.types.MapperRegistry;
 
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
 /**
- * For now, there is support just for convert to Map<String, simpleType>
  *
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
  */
 public class BasicDBObjectToMapMapper implements Mapper<BasicDBObject, Map> {
 
+    private final MapperRegistry mapperRegistry;
+
+    public BasicDBObjectToMapMapper(MapperRegistry mapperRegistry) {
+        this.mapperRegistry = mapperRegistry;
+    }
+
     @Override
     public Map convertObject(MapperContext<BasicDBObject, Map> context) {
         BasicDBObject dbObjectToConvert = context.getObjectToConvert();
+        Type expectedElementValueType = context.getGenericTypes().get(1);
 
         HashMap<String, Object> result = new HashMap<String, Object>();
         for (Map.Entry<String, Object> entry : dbObjectToConvert.entrySet()) {
             String key = entry.getKey();
-            Object value = entry.getValue();
+            Object dbValue = entry.getValue();
 
             // Workaround as manually inserted numbers into mongo may be treated as "Double"
-            if (value instanceof Double && context.getGenericTypes().get(1) == Integer.class) {
-                value = ((Double)value).intValue();
+            if (dbValue instanceof Double && expectedElementValueType == Integer.class) {
+                dbValue = ((Double)dbValue).intValue();
             }
 
+            MapperContext<Object, Object> newContext = getMapperContext(dbValue, expectedElementValueType);
+            Object value = mapperRegistry.convertDBObjectToApplicationObject(newContext);
+
             if (key.contains(MapMapper.DOT_PLACEHOLDER)) {
                 key = key.replaceAll(MapMapper.DOT_PLACEHOLDER, ".");
             }
@@ -46,4 +59,19 @@ public class BasicDBObjectToMapMapper implements Mapper<BasicDBObject, Map> {
     public Class<Map> getExpectedReturnType() {
         return Map.class;
     }
+
+    private MapperContext<Object, Object> getMapperContext(Object dbValue, Type expectedElementValueType) {
+        if (expectedElementValueType instanceof Class) {
+            Class<?> clazz = (Class<?>) expectedElementValueType;
+            return new MapperContext<>(dbValue, clazz, null);
+        } else if (expectedElementValueType instanceof ParameterizedType) {
+            ParameterizedType parameterized = (ParameterizedType) expectedElementValueType;
+            Class<?> expectedClazz = (Class<?>) parameterized.getRawType();
+            Type[] generics = parameterized.getActualTypeArguments();
+
+            return new MapperContext<>(dbValue, expectedClazz, Arrays.asList(generics));
+        } else {
+            throw new IllegalArgumentException("Unexpected type: '" + expectedElementValueType + "' for converting " + dbValue);
+        }
+    }
 }
diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/MapMapper.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/MapMapper.java
index d4f0d29..5ec174b 100644
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/MapMapper.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/MapMapper.java
@@ -3,6 +3,7 @@ package org.keycloak.connections.mongo.impl.types;
 import com.mongodb.BasicDBObject;
 import org.keycloak.connections.mongo.api.types.Mapper;
 import org.keycloak.connections.mongo.api.types.MapperContext;
+import org.keycloak.connections.mongo.api.types.MapperRegistry;
 
 import java.util.Map;
 import java.util.Set;
@@ -17,30 +18,34 @@ public class MapMapper<T extends Map> implements Mapper<T, BasicDBObject> {
     // Just some dummy way of encoding . character as it's not allowed by mongo in key fields
     static final String DOT_PLACEHOLDER = "###";
 
+    private final MapperRegistry mapperRegistry;
     private final Class<T> mapType;
 
-    public MapMapper(Class<T> mapType) {
+    public MapMapper(MapperRegistry mapperRegistry, Class<T> mapType) {
+        this.mapperRegistry = mapperRegistry;
         this.mapType = mapType;
     }
 
     @Override
     public BasicDBObject convertObject(MapperContext<T, BasicDBObject> context) {
         T mapToConvert = context.getObjectToConvert();
-        return convertMap(mapToConvert);
+        return convertMap(mapToConvert, mapperRegistry);
     }
 
-    public static BasicDBObject convertMap(Map mapToConvert) {
+    public static BasicDBObject convertMap(Map mapToConvert, MapperRegistry mapperRegistry) {
         BasicDBObject dbObject = new BasicDBObject();
         Set<Map.Entry> entries = mapToConvert.entrySet();
         for (Map.Entry entry : entries) {
             String key = (String)entry.getKey();
             Object value = entry.getValue();
 
+            Object dbValue = mapperRegistry==null ? entry.getValue() : mapperRegistry.convertApplicationObjectToDBObject(value, Object.class);
+
             if (key.contains(".")) {
                 key = key.replaceAll("\\.", DOT_PLACEHOLDER);
             }
 
-            dbObject.put(key, value);
+            dbObject.put(key, dbValue);
         }
         return dbObject;
     }
diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/MongoConnectionProviderFactory.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/MongoConnectionProviderFactory.java
index e787ce6..bce5fe4 100644
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/MongoConnectionProviderFactory.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/MongoConnectionProviderFactory.java
@@ -1,9 +1,9 @@
 package org.keycloak.connections.mongo;
 
-import org.keycloak.provider.ProviderFactory;
+import org.keycloak.provider.ServerInfoAwareProviderFactory;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
-public interface MongoConnectionProviderFactory extends ProviderFactory<MongoConnectionProvider> {
+public interface MongoConnectionProviderFactory extends ServerInfoAwareProviderFactory<MongoConnectionProvider> {
 }
diff --git a/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/DefaultMongoUpdaterProvider.java b/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/DefaultMongoUpdaterProvider.java
index 3ca2bff..fa75d6b 100644
--- a/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/DefaultMongoUpdaterProvider.java
+++ b/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/DefaultMongoUpdaterProvider.java
@@ -27,7 +27,8 @@ public class DefaultMongoUpdaterProvider implements MongoUpdaterProvider {
             Update1_1_0_Beta1.class,
             Update1_2_0_Beta1.class,
             Update1_2_0_CR1.class,
-            Update1_3_0.class
+            Update1_3_0.class,
+            Update1_4_0.class
     };
 
     @Override
diff --git a/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/updates/Update1_2_0_Beta1.java b/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/updates/Update1_2_0_Beta1.java
index abaae4c..aedd9f9 100644
--- a/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/updates/Update1_2_0_Beta1.java
+++ b/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/updates/Update1_2_0_Beta1.java
@@ -249,7 +249,7 @@ public class Update1_2_0_Beta1 extends Update {
                     dbMapper.put("protocolMapper", protocolMapper.getProtocolMapper());
 
                     Map<String, String> config = protocolMapper.getConfig();
-                    BasicDBObject dbConfig = MapMapper.convertMap(config);
+                    BasicDBObject dbConfig = MapMapper.convertMap(config, null);
                     dbMapper.put("config", dbConfig);
 
                     dbProtocolMappers.add(dbMapper);
diff --git a/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/updates/Update1_4_0.java b/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/updates/Update1_4_0.java
new file mode 100644
index 0000000..b58d5a3
--- /dev/null
+++ b/connections/mongo-update/src/main/java/org/keycloak/connections/mongo/updater/impl/updates/Update1_4_0.java
@@ -0,0 +1,63 @@
+package org.keycloak.connections.mongo.updater.impl.updates;
+
+import java.util.HashSet;
+import java.util.Map;
+
+import com.mongodb.BasicDBList;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import org.keycloak.models.KeycloakSession;
+import org.keycloak.representations.idm.IdentityProviderRepresentation;
+
+/**
+ * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
+ */
+public class Update1_4_0 extends Update {
+
+    @Override
+    public String getId() {
+        return "1.4.0";
+    }
+
+    @Override
+    public void update(KeycloakSession session) throws ClassNotFoundException {
+        deleteEntries("clientSessions");
+        deleteEntries("sessions");
+
+        // Remove warning
+        removeField("realms", "authenticators");
+
+        updateUserAttributes();
+    }
+
+    private void updateUserAttributes() {
+        DBCollection users = db.getCollection("users");
+        DBCursor usersCursor = users.find();
+
+        try {
+            while (usersCursor.hasNext()) {
+                BasicDBObject user = (BasicDBObject) usersCursor.next();
+
+                BasicDBObject attributes = (BasicDBObject) user.get("attributes");
+                if (attributes != null) {
+                    for (Map.Entry<String, Object> attr : new HashSet<>(attributes.entrySet())) {
+                        String attrName = attr.getKey();
+                        Object attrValue = attr.getValue();
+                        if (attrValue != null && attrValue instanceof String) {
+                            BasicDBList asList = new BasicDBList();
+                            asList.add(attrValue);
+                            attributes.put(attrName, asList);
+                        }
+                    }
+
+                    user.put("attributes", attributes);
+
+                    users.save(user);
+                }
+            }
+        } finally {
+            usersCursor.close();
+        }
+    }
+}
diff --git a/distribution/feature-packs/adapter-feature-pack/feature-pack-build.xml b/distribution/feature-packs/adapter-feature-pack/feature-pack-build.xml
index e55c8d9..e50cd6c 100644
--- a/distribution/feature-packs/adapter-feature-pack/feature-pack-build.xml
+++ b/distribution/feature-packs/adapter-feature-pack/feature-pack-build.xml
@@ -1,6 +1,6 @@
 <build xmlns="urn:wildfly:feature-pack-build:1.0">
     <dependencies>
-        <artifact name="org.wildfly:wildfly-web-feature-pack" />
+        <artifact name="org.wildfly:wildfly-feature-pack" />
     </dependencies>
     <config>
         <standalone template="configuration/standalone/template.xml" subsystems="configuration/standalone/subsystems.xml" output-file="standalone/configuration/standalone.xml" />
diff --git a/distribution/feature-packs/adapter-feature-pack/pom.xml b/distribution/feature-packs/adapter-feature-pack/pom.xml
index 4668542..88b18d6 100644
--- a/distribution/feature-packs/adapter-feature-pack/pom.xml
+++ b/distribution/feature-packs/adapter-feature-pack/pom.xml
@@ -20,9 +20,9 @@
     <parent>
         <groupId>org.keycloak</groupId>
         <artifactId>feature-packs-parent</artifactId>
-        <version>1.3.0.Final-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
+        <version>1.4.0.Final-SNAPSHOT</version>
     </parent>
+
     <modelVersion>4.0.0</modelVersion>
     
     <groupId>org.keycloak</groupId>
@@ -33,92 +33,24 @@
 
     <dependencies>
         <dependency>
-            <groupId>com.github.relaxng</groupId>
-            <artifactId>relaxngDatatype</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.istack</groupId>
-            <artifactId>istack-commons-runtime</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.istack</groupId>
-            <artifactId>istack-commons-tools</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.xml.bind.external</groupId>
-            <artifactId>rngom</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.xsom</groupId>
-            <artifactId>xsom</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-all</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>jaxb-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>jaxb-runtime</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>jaxb-xjc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>codemodel</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>txw2</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.jboss.spec.javax.xml.bind</groupId>
-            <artifactId>jboss-jaxb-api_2.2_spec</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.jboss.xnio.netty</groupId>
-            <artifactId>netty-xnio-transport</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>joda-time</groupId>
-            <artifactId>joda-time</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpmime</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.james</groupId>
-            <artifactId>apache-mime4j</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.bouncycastle</groupId>
-            <artifactId>bcprov-jdk15on</artifactId>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-wf9-subsystem</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.bouncycastle</groupId>
-            <artifactId>bcpkix-jdk15on</artifactId>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-wildfly-adapter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
-            <artifactId>keycloak-wildfly-adapter-subsystem</artifactId>
+            <artifactId>keycloak-servlet-oauth-client</artifactId>
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
             <artifactId>keycloak-undertow-adapter</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.wildfly</groupId>
-            <artifactId>wildfly-web-feature-pack</artifactId>
+            <artifactId>wildfly-feature-pack</artifactId>
             <type>zip</type>
         </dependency>
     </dependencies>
diff --git a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/net/iharder/base64/main/module.xml b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/net/iharder/base64/main/module.xml
index ba70430..f0d1326 100644
--- a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/net/iharder/base64/main/module.xml
+++ b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/net/iharder/base64/main/module.xml
@@ -1,8 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-
-
-<module xmlns="urn:jboss:module:1.1" name="net.iharder.base64">
+<module xmlns="urn:jboss:module:1.3" name="net.iharder.base64">
     <resources>
         <artifact name="${net.iharder:base64}"/>
     </resources>
diff --git a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-adapter-core/main/module.xml b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-adapter-core/main/module.xml
index 07dcd06..6407abc 100644
--- a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-adapter-core/main/module.xml
+++ b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-adapter-core/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-adapter-core">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-adapter-core">
     <resources>
         <artifact name="${org.keycloak:keycloak-adapter-core}"/>
     </resources>
diff --git a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-adapter-subsystem/main/module.xml b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-adapter-subsystem/main/module.xml
index f7cd890..66278bd 100644
--- a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-adapter-subsystem/main/module.xml
+++ b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-adapter-subsystem/main/module.xml
@@ -22,26 +22,12 @@
   ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
   -->
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-adapter-subsystem">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-adapter-subsystem">
 
     <resources>
-        <artifact name="${org.keycloak:keycloak-wildfly-adapter-subsystem}"/>
     </resources>
 
     <dependencies>
-        <module name="javax.api"/>
-        <module name="org.jboss.staxmapper"/>
-        <module name="org.jboss.as.controller"/>
-        <module name="org.jboss.as.ee"/>
-        <module name="org.jboss.as.server"/>
-        <module name="org.jboss.modules"/>
-        <module name="org.jboss.msc"/>
-        <module name="org.jboss.logging"/>
-        <module name="org.jboss.vfs"/>
-        <module name="org.jboss.as.web-common" optional="true"/>
-        <module name="org.jboss.as.web" optional="true"/>
-        <module name="org.jboss.as.version" optional="true"/>
-        <module name="org.keycloak.keycloak-wildfly-adapter" optional="true"/>
-        <module name="org.jboss.metadata"/>
+        <module name="org.keycloak.keycloak-wf9-subsystem" export="true" services="export"/>
     </dependencies>
 </module>
diff --git a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core/main/module.xml b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core/main/module.xml
index b23c589..ce36b73 100644
--- a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core/main/module.xml
+++ b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-core">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-core">
     <resources>
         <artifact name="${org.keycloak:keycloak-core}"/>
     </resources>
diff --git a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-jboss-adapter-core/main/module.xml b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-jboss-adapter-core/main/module.xml
index 6e5b217..243a5b9 100644
--- a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-jboss-adapter-core/main/module.xml
+++ b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-jboss-adapter-core/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-jboss-adapter-core">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-jboss-adapter-core">
     <resources>
         <artifact name="${org.keycloak:keycloak-jboss-adapter-core}"/>
     </resources>
diff --git a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-servlet-oauth-client/main/module.xml b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-servlet-oauth-client/main/module.xml
new file mode 100755
index 0000000..73fccad
--- /dev/null
+++ b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-servlet-oauth-client/main/module.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-servlet-oauth-client">
+    <resources>
+        <artifact name="${org.keycloak:keycloak-servlet-oauth-client}"/>
+    </resources>
+    <dependencies>
+        <module name="javax.api"/>
+        <module name="javax.servlet.api"/>
+        <module name="org.jboss.logging"/>
+        <module name="org.picketbox"/>
+        <module name="org.apache.httpcomponents"/>
+        <module name="org.keycloak.keycloak-adapter-core"/>
+        <module name="org.keycloak.keycloak-core"/>
+    </dependencies>
+
+</module>
diff --git a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-undertow-adapter/main/module.xml b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-undertow-adapter/main/module.xml
index 9ba1cb2..75ac27e 100644
--- a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-undertow-adapter/main/module.xml
+++ b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-undertow-adapter/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-undertow-adapter">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-undertow-adapter">
     <resources>
         <artifact name="${org.keycloak:keycloak-undertow-adapter}"/>
     </resources>
diff --git a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wildfly-adapter/main/module.xml b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wildfly-adapter/main/module.xml
old mode 100644
new mode 100755
index df7cc03..88eaafa
--- a/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wildfly-adapter/main/module.xml
+++ b/distribution/feature-packs/adapter-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wildfly-adapter/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-wildfly-adapter">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-wildfly-adapter">
     <resources>
         <artifact name="${org.keycloak:keycloak-wildfly-adapter}"/>
     </resources>
@@ -12,7 +12,7 @@
         <module name="org.codehaus.jackson.jackson-core-asl"/>
         <module name="org.codehaus.jackson.jackson-mapper-asl"/>
         <module name="org.codehaus.jackson.jackson-xc"/>
-        <module name="org.apache.httpcomponents" />
+        <module name="org.apache.httpcomponents"/>
         <module name="javax.servlet.api"/>
         <module name="org.jboss.logging"/>
         <module name="io.undertow.core"/>
@@ -21,7 +21,6 @@
         <module name="org.keycloak.keycloak-undertow-adapter"/>
         <module name="org.keycloak.keycloak-adapter-core"/>
         <module name="org.keycloak.keycloak-core"/>
-        <module name="org.jboss.xnio"/>
     </dependencies>
 
 </module>
diff --git a/distribution/feature-packs/pom.xml b/distribution/feature-packs/pom.xml
index f5402ee..32606ee 100644
--- a/distribution/feature-packs/pom.xml
+++ b/distribution/feature-packs/pom.xml
@@ -14,7 +14,7 @@
     <packaging>pom</packaging>
 
     <modules>
-        <!--<module>adapter-feature-pack</module>-->
+        <module>adapter-feature-pack</module>
         <module>server-feature-pack</module>
     </modules>
 </project>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/com/google/zxing/core/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/com/google/zxing/core/main/module.xml
index cc18aaa..d2d0ca6 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/com/google/zxing/core/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/com/google/zxing/core/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="com.google.zxing.core">
+<module xmlns="urn:jboss:module:1.3" name="com.google.zxing.core">
     <resources>
         <artifact name="${com.google.zxing:core}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/com/google/zxing/javase/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/com/google/zxing/javase/main/module.xml
index b73ba9b..6909121 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/com/google/zxing/javase/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/com/google/zxing/javase/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="com.google.zxing.javase">
+<module xmlns="urn:jboss:module:1.3" name="com.google.zxing.javase">
     <resources>
         <artifact name="${com.google.zxing:javase}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/de/idyl/winzipaes/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/de/idyl/winzipaes/main/module.xml
index 410333d..ef5c336 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/de/idyl/winzipaes/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/de/idyl/winzipaes/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="de.idyl.winzipaes">
+<module xmlns="urn:jboss:module:1.3" name="de.idyl.winzipaes">
     <resources>
         <artifact name="${de.idyl:winzipaes}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/net/iharder/base64/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/net/iharder/base64/main/module.xml
index ba70430..efc692e 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/net/iharder/base64/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/net/iharder/base64/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="net.iharder.base64">
+<module xmlns="urn:jboss:module:1.3" name="net.iharder.base64">
     <resources>
         <artifact name="${net.iharder:base64}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/freemarker/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/freemarker/main/module.xml
index 2043bef..df8dae3 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/freemarker/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/freemarker/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.freemarker">
+<module xmlns="urn:jboss:module:1.3" name="org.freemarker">
     <resources>
         <artifact name="${org.freemarker:freemarker}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/jboss/as/product/keycloak/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/jboss/as/product/keycloak/module.xml
index 4367111..d59ccb6 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/jboss/as/product/keycloak/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/jboss/as/product/keycloak/module.xml
@@ -22,7 +22,7 @@
   ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
   -->
 
-<module xmlns="urn:jboss:module:1.1" name="org.jboss.as.product" slot="keycloak">
+<module xmlns="urn:jboss:module:1.3" name="org.jboss.as.product" slot="keycloak">
 
     <resources>
         <resource-root path="dir"/>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-account-api/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-account-api/main/module.xml
index d36887e..ff79ea3 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-account-api/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-account-api/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-account-api">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-account-api">
     <resources>
         <artifact name="${org.keycloak:keycloak-account-api}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-account-freemarker/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-account-freemarker/main/module.xml
index 1512a9e..12a27b4 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-account-freemarker/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-account-freemarker/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-account-freemarker">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-account-freemarker">
     <resources>
         <artifact name="${org.keycloak:keycloak-account-freemarker}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-core/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-core/main/module.xml
index f983726..148ca83 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-core/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-core/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-broker-core">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-broker-core">
     <resources>
         <artifact name="${org.keycloak:keycloak-broker-core}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-oidc/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-oidc/main/module.xml
index 1a75cd1..5f1696b 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-oidc/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-oidc/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-broker-oidc">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-broker-oidc">
     <resources>
         <artifact name="${org.keycloak:keycloak-broker-oidc}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-saml/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-saml/main/module.xml
index 839d9f9..78800f8 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-saml/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-broker-saml/main/module.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-broker-saml">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-broker-saml">
     <resources>
         <artifact name="${org.keycloak:keycloak-broker-saml}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-file/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-file/main/module.xml
index ef1f1b2..2821a82 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-file/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-file/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-connections-file">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-connections-file">
     <resources>
         <artifact name="${org.keycloak:keycloak-connections-file}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-http-client/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-http-client/main/module.xml
index f52288e..33acbc3 100755
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-http-client/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-http-client/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-connections-http-client">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-connections-http-client">
     <resources>
         <artifact name="${org.keycloak:keycloak-connections-http-client}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-infinispan/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-infinispan/main/module.xml
index 94a9f1a..6ec7f49 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-infinispan/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-infinispan/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-connections-infinispan">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-connections-infinispan">
     <resources>
         <artifact name="${org.keycloak:keycloak-connections-infinispan}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-jpa/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-jpa/main/module.xml
index ef36ac3..befbaca 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-jpa/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-jpa/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-connections-jpa">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-connections-jpa">
     <resources>
         <artifact name="${org.keycloak:keycloak-connections-jpa}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-jpa-liquibase/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-jpa-liquibase/main/module.xml
index 8ade3fd..2e001ae 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-jpa-liquibase/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-jpa-liquibase/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-connections-jpa-liquibase">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-connections-jpa-liquibase">
     <resources>
         <artifact name="${org.keycloak:keycloak-connections-jpa-liquibase}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-mongo/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-mongo/main/module.xml
index 504023f..c1820d0 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-mongo/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-mongo/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-connections-mongo">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-connections-mongo">
     <resources>
         <artifact name="${org.keycloak:keycloak-connections-mongo}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-mongo-update/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-mongo-update/main/module.xml
index 621f06d..5af24c9 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-mongo-update/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-connections-mongo-update/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-connections-mongo-update">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-connections-mongo-update">
     <resources>
         <artifact name="${org.keycloak:keycloak-connections-mongo-update}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core/main/module.xml
index b23c589..ce36b73 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-core">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-core">
     <resources>
         <artifact name="${org.keycloak:keycloak-core}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core-jaxrs/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core-jaxrs/main/module.xml
index c773354..359459c 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core-jaxrs/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-core-jaxrs/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-core-jaxrs">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-core-jaxrs">
     <resources>
         <artifact name="${org.keycloak:keycloak-core-jaxrs}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-email-api/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-email-api/main/module.xml
index ed433b5..7936e57 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-email-api/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-email-api/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-email-api">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-email-api">
     <resources>
         <artifact name="${org.keycloak:keycloak-email-api}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-email-freemarker/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-email-freemarker/main/module.xml
index a0c371f..5d7e738 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-email-freemarker/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-email-freemarker/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-email-freemarker">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-email-freemarker">
     <resources>
         <artifact name="${org.keycloak:keycloak-email-freemarker}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-api/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-api/main/module.xml
index 2f8c152..6bf4c57 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-api/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-api/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-events-api">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-events-api">
     <resources>
         <artifact name="${org.keycloak:keycloak-events-api}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-email/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-email/main/module.xml
index 255f830..8c924b9 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-email/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-email/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-events-email">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-events-email">
     <resources>
         <artifact name="${org.keycloak:keycloak-events-email}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-jboss-logging/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-jboss-logging/main/module.xml
index 5a6fe2b..cb3911e 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-jboss-logging/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-jboss-logging/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-events-jboss-logging">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-events-jboss-logging">
     <resources>
         <artifact name="${org.keycloak:keycloak-events-jboss-logging}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-jpa/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-jpa/main/module.xml
index 12c859e..51820cb 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-jpa/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-jpa/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-events-jpa">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-events-jpa">
     <resources>
         <artifact name="${org.keycloak:keycloak-events-jpa}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-mongo/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-mongo/main/module.xml
index 4e48e7f..58f4ef6 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-mongo/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-events-mongo/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-events-mongo">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-events-mongo">
     <resources>
         <artifact name="${org.keycloak:keycloak-events-mongo}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-api/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-api/main/module.xml
index 2e50335..f93fac0 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-api/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-api/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-export-import-api">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-export-import-api">
     <resources>
         <artifact name="${org.keycloak:keycloak-export-import-api}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-dir/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-dir/main/module.xml
index 1cda32b..e07d83a 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-dir/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-dir/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-export-import-dir">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-export-import-dir">
     <resources>
         <artifact name="${org.keycloak:keycloak-export-import-dir}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-single-file/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-single-file/main/module.xml
index a390929..75bfd6a 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-single-file/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-single-file/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-export-import-single-file">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-export-import-single-file">
     <resources>
         <artifact name="${org.keycloak:keycloak-export-import-single-file}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-zip/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-zip/main/module.xml
index a33365d..ef9dfb3 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-zip/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-export-import-zip/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-export-import-zip">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-export-import-zip">
     <resources>
         <artifact name="${org.keycloak:keycloak-export-import-zip}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-forms-common-freemarker/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-forms-common-freemarker/main/module.xml
index c6c6325..9c2d045 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-forms-common-freemarker/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-forms-common-freemarker/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-forms-common-freemarker">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-forms-common-freemarker">
     <resources>
         <artifact name="${org.keycloak:keycloak-forms-common-freemarker}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-forms-common-themes/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-forms-common-themes/main/module.xml
index 0e12a97..b6bb215 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-forms-common-themes/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-forms-common-themes/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-forms-common-themes">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-forms-common-themes">
     <resources>
         <artifact name="${org.keycloak:keycloak-forms-common-themes}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-invalidation-cache-infinispan/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-invalidation-cache-infinispan/main/module.xml
index 572ab38..1fbd5a8 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-invalidation-cache-infinispan/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-invalidation-cache-infinispan/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-invalidation-cache-infinispan">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-invalidation-cache-infinispan">
     <resources>
         <artifact name="${org.keycloak:keycloak-invalidation-cache-infinispan}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-invalidation-cache-model/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-invalidation-cache-model/main/module.xml
index 1844bc8..8136f83 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-invalidation-cache-model/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-invalidation-cache-model/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-invalidation-cache-model">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-invalidation-cache-model">
     <resources>
         <artifact name="${org.keycloak:keycloak-invalidation-cache-model}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-js-adapter/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-js-adapter/main/module.xml
index d99ac75..7f8c1ee 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-js-adapter/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-js-adapter/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-js-adapter">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-js-adapter">
     <resources>
         <artifact name="${org.keycloak:keycloak-js-adapter}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-kerberos-federation/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-kerberos-federation/main/module.xml
index 4f9da8b..620c797 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-kerberos-federation/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-kerberos-federation/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-kerberos-federation">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-kerberos-federation">
     <resources>
         <artifact name="${org.keycloak:keycloak-kerberos-federation}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-ldap-federation/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-ldap-federation/main/module.xml
index e8c9e4d..b1bd769 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-ldap-federation/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-ldap-federation/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-ldap-federation">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-ldap-federation">
     <resources>
         <artifact name="${org.keycloak:keycloak-ldap-federation}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-login-api/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-login-api/main/module.xml
index ff6f6ac..137514d 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-login-api/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-login-api/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-login-api">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-login-api">
     <resources>
         <artifact name="${org.keycloak:keycloak-login-api}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-login-freemarker/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-login-freemarker/main/module.xml
index 1cb5c41..ba3b629 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-login-freemarker/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-login-freemarker/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-login-freemarker">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-login-freemarker">
     <resources>
         <artifact name="${org.keycloak:keycloak-login-freemarker}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-api/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-api/main/module.xml
index 14a0a86..3560576 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-api/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-api/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-model-api">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-model-api">
     <resources>
         <artifact name="${org.keycloak:keycloak-model-api}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-file/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-file/main/module.xml
index e3ae276..d21a537 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-file/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-file/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-model-file">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-model-file">
     <resources>
         <artifact name="${org.keycloak:keycloak-model-file}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-jpa/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-jpa/main/module.xml
index 4f50b7a..4e62ca7 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-jpa/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-jpa/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-model-jpa">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-model-jpa">
     <resources>
         <artifact name="${org.keycloak:keycloak-model-jpa}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-mongo/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-mongo/main/module.xml
index 702406c..9c99b57 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-mongo/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-mongo/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-model-mongo">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-model-mongo">
     <resources>
         <artifact name="${org.keycloak:keycloak-model-mongo}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-infinispan/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-infinispan/main/module.xml
index 23f94b1..877f061 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-infinispan/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-infinispan/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-model-sessions-infinispan">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-model-sessions-infinispan">
     <resources>
         <artifact name="${org.keycloak:keycloak-model-sessions-infinispan}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-jpa/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-jpa/main/module.xml
index 2033069..39490fc 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-jpa/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-jpa/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-model-sessions-jpa">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-model-sessions-jpa">
     <resources>
         <artifact name="${org.keycloak:keycloak-model-sessions-jpa}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-mem/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-mem/main/module.xml
index 6a1d101..47c9d40 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-mem/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-mem/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-model-sessions-mem">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-model-sessions-mem">
     <resources>
         <artifact name="${org.keycloak:keycloak-model-sessions-mem}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-mongo/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-mongo/main/module.xml
index 6993680..0b5aaa0 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-mongo/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-model-sessions-mongo/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-model-sessions-mongo">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-model-sessions-mongo">
     <resources>
         <artifact name="${org.keycloak:keycloak-model-sessions-mongo}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-saml-core/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-saml-core/main/module.xml
index c09490e..8c78469 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-saml-core/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-saml-core/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-saml-core">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-saml-core">
     <resources>
         <artifact name="${org.keycloak:keycloak-saml-core}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-saml-protocol/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-saml-protocol/main/module.xml
index fc0cd15..03a5633 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-saml-protocol/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-saml-protocol/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-saml-protocol">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-saml-protocol">
     <resources>
         <artifact name="${org.keycloak:keycloak-saml-protocol}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-server-subsystem/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-server-subsystem/main/module.xml
index b0309bd..d6e7d81 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-server-subsystem/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-server-subsystem/main/module.xml
@@ -22,7 +22,7 @@
   ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
   -->
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-server-subsystem">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-server-subsystem">
 
     <resources>
         <resource-root path="."/>
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 4917ab6..5b55602 100644
--- 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
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-services">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-services">
     <resources>
         <artifact name="${org.keycloak:keycloak-services}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-core/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-core/main/module.xml
index 836d5d6..47a1348 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-core/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-core/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-social-core">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-social-core">
     <resources>
         <artifact name="${org.keycloak:keycloak-social-core}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-facebook/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-facebook/main/module.xml
index 4c22779..30a2489 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-facebook/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-facebook/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-social-facebook">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-social-facebook">
     <resources>
         <artifact name="${org.keycloak:keycloak-social-facebook}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-github/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-github/main/module.xml
index 9197bb0..6a8e0c3 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-github/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-github/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-social-github">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-social-github">
     <resources>
         <artifact name="${org.keycloak:keycloak-social-github}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-google/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-google/main/module.xml
index bb56189..965a0e4 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-google/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-google/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-social-google">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-social-google">
     <resources>
         <artifact name="${org.keycloak:keycloak-social-google}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-linkedin/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-linkedin/main/module.xml
index db38543..3bba4a8 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-linkedin/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-linkedin/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-social-linkedin">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-social-linkedin">
     <resources>
         <artifact name="${org.keycloak:keycloak-social-linkedin}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-stackoverflow/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-stackoverflow/main/module.xml
index 5af13ce..a1ac083 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-stackoverflow/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-stackoverflow/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-social-stackoverflow">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-social-stackoverflow">
     <resources>
         <artifact name="${org.keycloak:keycloak-social-stackoverflow}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-twitter/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-twitter/main/module.xml
index cf56209..f07af8b 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-twitter/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-social-twitter/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-social-twitter">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-social-twitter">
     <resources>
         <artifact name="${org.keycloak:keycloak-social-twitter}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-timer-api/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-timer-api/main/module.xml
index 7704916..af13ac0 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-timer-api/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-timer-api/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-timer-api">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-timer-api">
     <resources>
         <artifact name="${org.keycloak:keycloak-timer-api}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-timer-basic/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-timer-basic/main/module.xml
index e2279f9..1ee1936 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-timer-basic/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-timer-basic/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-timer-basic">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-timer-basic">
     <resources>
         <artifact name="${org.keycloak:keycloak-timer-basic}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wf9-server-subsystem/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wf9-server-subsystem/main/module.xml
index 430bb0a..6748cb4 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wf9-server-subsystem/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/keycloak/keycloak-wf9-server-subsystem/main/module.xml
@@ -22,7 +22,7 @@
   ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
   -->
 
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-wf9-server-subsystem">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-wf9-server-subsystem">
 
     <resources>
         <resource-root path="."/>
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 556769e..58d5184 100644
--- 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
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<module xmlns="urn:jboss:module:1.1" name="org.keycloak.keycloak-wildfly-extensions">
+<module xmlns="urn:jboss:module:1.3" name="org.keycloak.keycloak-wildfly-extensions">
     <resources>
         <artifact name="${org.keycloak:keycloak-wildfly-extensions}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/liquibase/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/liquibase/main/module.xml
index d75eef0..db707e8 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/liquibase/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/liquibase/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.liquibase">
+<module xmlns="urn:jboss:module:1.3" name="org.liquibase">
     <resources>
         <artifact name="${org.liquibase:liquibase-core}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/mongodb/mongo-java-driver/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/mongodb/mongo-java-driver/main/module.xml
index bb4acdd..2cb5fbe 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/mongodb/mongo-java-driver/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/mongodb/mongo-java-driver/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.mongodb.mongo-java-driver">
+<module xmlns="urn:jboss:module:1.3" name="org.mongodb.mongo-java-driver">
     <resources>
         <artifact name="${org.mongodb:mongo-java-driver}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/twitter4j/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/twitter4j/main/module.xml
index 70b84dc..9dc34a5 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/twitter4j/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/org/twitter4j/main/module.xml
@@ -2,7 +2,7 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="org.twitter4j">
+<module xmlns="urn:jboss:module:1.3" name="org.twitter4j">
     <resources>
         <artifact name="${org.twitter4j:twitter4j-core}"/>
     </resources>
diff --git a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/sun/jdk/jgss/main/module.xml b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/sun/jdk/jgss/main/module.xml
index 6df03ff..100d65d 100644
--- a/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/sun/jdk/jgss/main/module.xml
+++ b/distribution/feature-packs/server-feature-pack/src/main/resources/modules/system/layers/base/sun/jdk/jgss/main/module.xml
@@ -2,9 +2,8 @@
 
 
 
-<module xmlns="urn:jboss:module:1.1" name="sun.jdk.jgss">
+<module xmlns="urn:jboss:module:1.3" name="sun.jdk.jgss">
     <resources>
-        <!-- Insert resources here -->
     </resources>
     <dependencies>
         <system export="true">
diff --git a/events/jpa/pom.xml b/events/jpa/pom.xml
index 51eace9..650f80e 100755
--- a/events/jpa/pom.xml
+++ b/events/jpa/pom.xml
@@ -35,7 +35,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/examples/kerberos/pom.xml b/examples/kerberos/pom.xml
index ffe8259..69429f5 100755
--- a/examples/kerberos/pom.xml
+++ b/examples/kerberos/pom.xml
@@ -40,6 +40,11 @@
             <artifactId>keycloak-adapter-core</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-util-embedded-ldap</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -62,4 +67,28 @@
         </plugins>
     </build>
 
+    <profiles>
+        <profile>
+            <id>kerberos</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>exec-maven-plugin</artifactId>
+                        <configuration>
+                            <mainClass>org.keycloak.util.ldap.KerberosEmbeddedServer</mainClass>
+                            <classpathScope>test</classpathScope>
+                            <systemProperties>
+                                <systemProperty>
+                                    <key>ldap.ldif</key>
+                                    <value>kerberos-example-users.ldif</value>
+                                </systemProperty>
+                            </systemProperties>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
 </project>
diff --git a/examples/kerberos/README.md b/examples/kerberos/README.md
index c65316c..7b95993 100644
--- a/examples/kerberos/README.md
+++ b/examples/kerberos/README.md
@@ -43,21 +43,13 @@ is in your `/etc/hosts` before other records for the 127.0.0.1 host to avoid iss
 for credential delegation example, as application needs to forward Kerberos ticket and authenticate with it against LDAP server. 
 See [this file](https://github.com/keycloak/keycloak/blob/master/testsuite/integration/src/test/resources/kerberos/test-krb5.conf) for inspiration.
 
-**6)**  Run ApacheDS based Kerberos server . The [LDAP Example](../ldap) contains the embedded server, which you can run for example 
-with these commands (assuming you're in `kerberos` directory with this example)
+**6)**  Run ApacheDS based LDAP server. You can run the command like this (assuming you're in the "kerberos" directory with this example): 
 
 ```
-cd ../ldap
-mvn clean install
-cd ..
-java -jar ldap/embedded-ldap/target/embedded-ldap.jar kerberos
+mvn exec:java -Pkerberos
 ```
 
-This will also automatically import the LDIF from `users.ldif` of kerberos example into the LDAP server. If you want to import your own LDIF file, 
-you can add the system property `ldap.ldif` with the path of the LDIF file to the command. For example:
-```
-java -jar -Dldap.ldif=/tmp/my-users.ldif ldap/embedded-ldap/target/embedded-ldap.jar kerberos
-```  
+This will also automatically import the LDIF from `kerberos-example-users.ldif` of kerberos example into the LDAP server. Replace with your own LDIF file if you want different users.
 
 A bit more details about embedded Kerberos server in [testsuite README](https://github.com/keycloak/keycloak/blob/master/misc/Testsuite.md#kerberos-server).
 

examples/ldap/pom.xml 87(+77 -10)

diff --git a/examples/ldap/pom.xml b/examples/ldap/pom.xml
index d506efc..8081430 100644
--- a/examples/ldap/pom.xml
+++ b/examples/ldap/pom.xml
@@ -1,20 +1,87 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>keycloak-examples-parent</artifactId>
         <groupId>org.keycloak</groupId>
         <version>1.4.0.Final-SNAPSHOT</version>
     </parent>
-    <name>Keycloak LDAP Examples - Parent</name>
-    <description/>
+
     <modelVersion>4.0.0</modelVersion>
+    <groupId>org.keycloak.example.demo</groupId>
+    <artifactId>keycloak-examples-ldap</artifactId>
+    <packaging>war</packaging>
+    <name>LDAP Demo Application</name>
+
+    <repositories>
+        <repository>
+            <id>jboss</id>
+            <name>jboss repo</name>
+            <url>http://repository.jboss.org/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.jboss.spec.javax.servlet</groupId>
+            <artifactId>jboss-servlet-api_3.0_spec</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-util-embedded-ldap</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 
-    <artifactId>keycloak-examples-ldap-parent</artifactId>
-    <packaging>pom</packaging>
+    <build>
+        <finalName>ldap-portal</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.jboss.as.plugins</groupId>
+                <artifactId>jboss-as-maven-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.wildfly.plugins</groupId>
+                <artifactId>wildfly-maven-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
-    <modules>
-        <module>embedded-ldap</module>
-        <module>ldap-app</module>
-    </modules>
+    <profiles>
+        <profile>
+            <id>ldap</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>exec-maven-plugin</artifactId>
+                        <configuration>
+                            <mainClass>org.keycloak.util.ldap.LDAPEmbeddedServer</mainClass>
+                            <classpathScope>test</classpathScope>
+                            <systemProperties>
+                                <systemProperty>
+                                    <key>ldap.ldif</key>
+                                    <value>ldap-example-users.ldif</value>
+                                </systemProperty>
+                            </systemProperties>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 
 </project>
\ No newline at end of file
diff --git a/examples/ldap/README.md b/examples/ldap/README.md
index ab3c978..4ad1d5d 100644
--- a/examples/ldap/README.md
+++ b/examples/ldap/README.md
@@ -13,24 +13,20 @@ The example application is then showing all the basic claims of current user tog
 
 Detailed steps how to make the example working:
 
-**1)** Build and deploy this sample's WAR file in `ldap-app/target/ldap-portal.war` . For this example, deploy on the same server that is running the Keycloak Server, 
+**1)** Build and deploy this sample's WAR file in `target/ldap-portal.war` . For this example, deploy on the same server that is running the Keycloak Server, 
 although this is not required for real world scenarios.
 
 
 **2)**  Run ApacheDS based LDAP server. You can run the command like this (assuming you're in the "ldap" directory with this example): 
 
 ```
-java -jar embedded-ldap/target/embedded-ldap.jar ldap
+mvn exec:java -Pldap
 ```
 
-This will also automatically import the LDIF from `ldap-app/users.ldif` into the LDAP server. If you want to import your own LDIF file, 
-you can add the system property `ldap.ldif` with the path of the LDIF file to the command. For example:
-```
-java -jar -Dldap.ldif=/tmp/my-users.ldif embedded-ldap/target/embedded-ldap.jar ldap
-```  
+This will also automatically import the LDIF from `ldap-example-users.ldif` into the LDAP server. Replace with your own LDIF file if you want different users.
  
  
-**3)** Run Keycloak server and import `ldap-app/ldaprealm.json` into it through admin console. This contains the realm with preconfigured LDAP federation provider and LDAP mappers 
+**3)** Run Keycloak server and import `ldaprealm.json` into it through admin console. This contains the realm with preconfigured LDAP federation provider and LDAP mappers 
 and protocol mappers. Note that there are not any roles or users in this file. All of users, roles and role mappings data will be imported automatically from LDAP. 
  
  
diff --git a/federation/ldap/src/main/java/org/keycloak/federation/ldap/idm/model/LDAPDn.java b/federation/ldap/src/main/java/org/keycloak/federation/ldap/idm/model/LDAPDn.java
index c7fbe06..f1cd341 100644
--- a/federation/ldap/src/main/java/org/keycloak/federation/ldap/idm/model/LDAPDn.java
+++ b/federation/ldap/src/main/java/org/keycloak/federation/ldap/idm/model/LDAPDn.java
@@ -2,6 +2,8 @@ package org.keycloak.federation.ldap.idm.model;
 
 import java.util.Deque;
 import java.util.LinkedList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -13,9 +15,9 @@ public class LDAPDn {
     public static LDAPDn fromString(String dnString) {
         LDAPDn dn = new LDAPDn();
 
-        String[] rdns = dnString.split(",");
+        String[] rdns = dnString.split("(?<!\\\\),");
         for (String entryStr : rdns) {
-            String[] rdn = entryStr.split("=");
+            String[] rdn = entryStr.split("(?<!\\\\)=");
             dn.addLast(rdn[0].trim(), rdn[1].trim());
         }
 
@@ -64,13 +66,33 @@ public class LDAPDn {
     }
 
     public void addFirst(String rdnName, String rdnValue) {
+        rdnValue = escape(rdnValue);
         entries.addFirst(new Entry(rdnName, rdnValue));
     }
 
-    public void addLast(String rdnName, String rdnValue) {
+    private void addLast(String rdnName, String rdnValue) {
         entries.addLast(new Entry(rdnName, rdnValue));
     }
 
+    // Need to escape "john,dot" to be "john\,dot"
+    private String escape(String rdnValue) {
+        if (rdnValue.contains(",")) {
+            StringBuilder result = new StringBuilder();
+            boolean first = true;
+            for (String split : rdnValue.split(",")) {
+                if (!first) {
+                    result.append("\\,");
+                } else {
+                    first = false;
+                }
+                result.append(split);
+            }
+            return result.toString();
+        } else {
+            return rdnValue;
+        }
+    }
+
 
     private static class Entry {
         private final String attrName;
diff --git a/federation/ldap/src/main/java/org/keycloak/federation/ldap/LDAPFederationProvider.java b/federation/ldap/src/main/java/org/keycloak/federation/ldap/LDAPFederationProvider.java
index 1fa601d..4edbc83 100755
--- a/federation/ldap/src/main/java/org/keycloak/federation/ldap/LDAPFederationProvider.java
+++ b/federation/ldap/src/main/java/org/keycloak/federation/ldap/LDAPFederationProvider.java
@@ -301,6 +301,12 @@ public class LDAPFederationProvider implements UserFederationProvider {
             return null;
         }
 
+        // Check here if user already exists
+        String ldapUsername = LDAPUtils.getUsername(ldapUser, ldapIdentityStore.getConfig());
+        if (session.userStorage().getUserByUsername(ldapUsername, realm) != null) {
+            throw new ModelDuplicateException("User with username '" + ldapUsername + "' already exists in Keycloak. It conflicts with LDAP user with email '" + email + "'");
+        }
+
         return importUserFromLDAP(session, realm, ldapUser);
     }
 
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js
index 8fb7c36..5e01598 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js
@@ -82,8 +82,8 @@ module.config([ '$routeProvider', function($routeProvider) {
                 realm : function(RealmLoader) {
                     return RealmLoader();
                 },
-                serverInfo : function(ServerInfoLoader) {
-                    return ServerInfoLoader();
+                serverInfo : function(ServerInfo) {
+                    return ServerInfo.delay;
                 }
             },
             controller : 'RealmLoginSettingsCtrl'
@@ -1133,7 +1133,22 @@ module.config([ '$routeProvider', function($routeProvider) {
             controller : 'AuthenticationConfigCreateCtrl'
         })
         .when('/server-info', {
-            templateUrl : resourceUrl + '/partials/server-info.html'
+            templateUrl : resourceUrl + '/partials/server-info.html',
+            resolve : {
+            	serverInfo : function(ServerInfoLoader) {
+                return ServerInfoLoader();
+            	}
+            },
+            controller : 'ServerInfoCtrl'
+        })
+        .when('/server-info/providers', {
+            templateUrl : resourceUrl + '/partials/server-info-providers.html',
+            resolve : {
+                serverInfo : function(ServerInfoLoader) {
+                    return ServerInfoLoader();
+                }
+            },
+            controller : 'ServerInfoCtrl'
         })
         .when('/logout', {
             templateUrl : resourceUrl + '/partials/home.html',
@@ -1867,4 +1882,4 @@ module.directive( 'kcOpen', function ( $location ) {
             });
         });
     };
-});
\ No newline at end of file
+});
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js
index 6331c9d..810aef7 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js
@@ -549,7 +549,7 @@ module.controller('ClientDetailCtrl', function($scope, realm, client, $route, se
         "bearer-only"
     ];
 
-    $scope.protocols = serverInfo.protocols;
+    $scope.protocols = Object.keys(serverInfo.providers['login-protocol'].providers).sort();
 
     $scope.signatureAlgorithms = [
         "RSA_SHA1",
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
index 85ad18b..15a8fa9 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
@@ -7,9 +7,6 @@ module.controller('GlobalCtrl', function($scope, $http, Auth, WhoAmI, Current, $
     $scope.resourceUrl = resourceUrl;
     $scope.auth = Auth;
     $scope.serverInfo = ServerInfo.get();
-    $scope.serverInfoUpdate = function() {
-        $scope.serverInfo = ServerInfo.get();
-    };
 
     function hasAnyAccess() {
         var realmAccess = Auth.user && Auth.user['realm_access'];
@@ -125,6 +122,25 @@ module.controller('RealmTabCtrl', function(Dialog, $scope, Current, Realm, Notif
     };
 });
 
+module.controller('ServerInfoCtrl', function($scope, ServerInfo) {
+    ServerInfo.reload();
+
+    $scope.serverInfo = ServerInfo.get();
+
+    $scope.$watch($scope.serverInfo, function() {
+        $scope.providers = [];
+        for(var spi in $scope.serverInfo.providers) {
+            var p = angular.copy($scope.serverInfo.providers[spi]);
+            p.name = spi;
+            $scope.providers.push(p)
+        }
+    });
+
+    $scope.serverInfoReload = function() {
+        ServerInfo.reload();
+    }
+});
+
 module.controller('RealmListCtrl', function($scope, Realm, Current) {
     $scope.realms = Realm.query();
     Current.realms = $scope.realms;
@@ -1217,7 +1233,7 @@ module.controller('RealmEventsConfigCtrl', function($scope, eventsConfig, RealmE
         }
     });
 
-    $scope.eventListeners = serverInfo.eventListeners;
+    $scope.eventListeners = Object.keys(serverInfo.providers.eventsListener.providers);
 
     $scope.eventSelectOptions = {
         'multiple': true,
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js
index 37a9566..c347759 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js
@@ -35,8 +35,10 @@ module.factory('RealmListLoader', function(Loader, Realm, $q) {
 	return Loader.get(Realm);
 });
 
-module.factory('ServerInfoLoader', function(Loader, ServerInfo, $q) {
-    return Loader.get(ServerInfo);
+module.factory('ServerInfoLoader', function(Loader, ServerInfo) {
+    return function() {
+        return ServerInfo.promise;
+    };
 });
 
 module.factory('RealmLoader', function(Loader, Realm, $route, $q) {
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js
index 3763ba9..04929ef 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js
@@ -215,10 +215,27 @@ module.factory('RealmLDAPConnectionTester', function($resource) {
     return $resource(authUrl + '/admin/realms/:realm/testLDAPConnection');
 });
 
-module.factory('ServerInfo', function($resource) {
-    return $resource(authUrl + '/admin/serverinfo');
-});
+module.service('ServerInfo', function($resource, $q, $http) {
+    var info = {};
+    var delay = $q.defer();
+
+    $http.get(authUrl + '/admin/serverinfo').success(function(data) {
+        info = data;
+        delay.resolve(info);
+    });
 
+    return {
+        get: function() {
+            return info;
+        },
+        reload: function() {
+            $http.get(authUrl + '/admin/serverinfo').success(function(data) {
+                angular.copy(data, info);
+            });
+        },
+        promise: delay.promise
+    }
+});
 
 
 module.factory('ClientProtocolMapper', function($resource) {
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/federated-mapper-detail.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/federated-mapper-detail.html
index b60d904..9147e09 100644
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/federated-mapper-detail.html
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/federated-mapper-detail.html
@@ -51,13 +51,6 @@
 
         <div class="form-group">
             <div class="col-md-10 col-md-offset-2" data-ng-show="!create && access.manageRealm">
-                <button kc-save>Save</button>
-                <button kc-cancel data-ng-click="cancel()">Cancel</button>
-            </div>
-        </div>
-
-        <div class="form-group">
-            <div class="col-md-10 col-md-offset-2" data-ng-show="!create && access.manageRealm">
                 <button kc-save  data-ng-show="changed">Save</button>
                 <button kc-reset data-ng-disabled="!changed">Clear changes</button>
             </div>
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/server-info.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/server-info.html
index 34c9a84..a92c774 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/server-info.html
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/server-info.html
@@ -1,66 +1,104 @@
-<div class="col-md-12">
-    <h1>Server Info</h1>
+<div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2">
+    <h1>
+        Server Info
+        <i id="serverInfoReload" class="pficon  pficon-restart clickable" data-ng-click="serverInfoReload()"></i>
+    </h1>
+
+    <ul class="nav nav-tabs">
+        <li class="active"><a href="#/server-info">Info</a></li>
+        <li><a href="#/server-info/providers">Providers</a></li>
+    </ul>
 
     <table class="table table-striped table-bordered">
         <tr>
-            <td>Version</td>
-            <td>{{serverInfo.version}}</td>
+            <td width="20%">Keycloak Version</td>
+            <td>{{serverInfo.systemInfo.version}}</td>
         </tr>
         <tr>
             <td>Server Time</td>
-            <td>{{serverInfo.serverTime}} (<a data-ng-click="serverInfoUpdate()">update</a>)</td>
+            <td>{{serverInfo.systemInfo.serverTime}}</td>
+        </tr>
+        <tr>
+            <td>Server Uptime</td>
+            <td>{{serverInfo.systemInfo.uptime}}</td>
         </tr>
     </table>
 
     <fieldset>
-        <legend collapsed>Providers</legend>
-
-        <div class="form-group">
-            <h3>Public SPIs</h3>
-            <kc-tooltip>For public SPIs there are built-in providers, but it's also supported to write your own custom providers.</kc-tooltip>
-
-            <table class="table table-striped table-bordered">
-                <thead>
-                <tr>
-                    <th>SPI</th>
-                    <th>Providers</th>
-                </tr>
-                </thead>
-                <tbody>
-                <tr data-ng-repeat="spi in (serverInfo.providers | filter:{internal:false} | orderBy:'name')">
-                    <td>{{spi.name}}</td>
-                    <td>
-                        <div data-ng-repeat="provider in (spi.implementations | orderBy:'toString()')">
-                            {{provider}}
-                        </div>
-                    </td>
-                </tr>
-                </tbody>
-            </table>
-        </div>
-
-        <div class="form-group">
-            <h3>Internal SPIs</h3>
-            <kc-tooltip>For internal SPIs there are only built-in providers. It's not recommended to write your own custom providers as internal SPIs may change or be removed without notice.</kc-tooltip>
+        <legend>Memory</legend>
+        <table class="table table-striped table-bordered" style="margin-top: 0;">
+            <tr>
+                <td width="20%">Total Memory</td>
+                <td>{{serverInfo.memoryInfo.totalFormated}}</td>
+            </tr>
+            <tr>
+                <td>Free Memory</td>
+                <td>{{serverInfo.memoryInfo.freeFormated}} ({{serverInfo.memoryInfo.freePercentage}}%)</td>
+            </tr>
+            <tr>
+                <td>Used Memory</td>
+                <td>{{serverInfo.memoryInfo.usedFormated}}</td>
+            </tr>
+        </table>
+    </fieldset>
 
-            <table class="table table-striped table-bordered">
-                <thead>
-                <tr>
-                    <th>SPI</th>
-                    <th>Providers</th>
-                </tr>
-                </thead>
-                <tbody>
-                <tr data-ng-repeat="spi in (serverInfo.providers | filter:{internal:true} | orderBy:'name')">
-                    <td>{{spi.name}}</td>
-                    <td>
-                        <div data-ng-repeat="provider in (spi.implementations | orderBy:'toString()')">
-                            {{provider}}
-                        </div>
-                    </td>
-                </tr>
-                </tbody>
-            </table>
-        </div>
+    <fieldset>
+        <legend>System</legend>
+        <table class="table table-striped table-bordered" style="margin-top: 0;">
+            <tr>
+                <td width="20%">Current Working Directory</td>
+                <td>{{serverInfo.systemInfo.userDir}}</td>
+            </tr>
+            <tr>
+                <td>Java Version</td>
+                <td>{{serverInfo.systemInfo.javaVersion}}</td>
+            </tr>
+            <tr>
+                <td>Java Vendor</td>
+                <td>{{serverInfo.systemInfo.javaVendor}}</td>
+            </tr>
+            <tr>
+                <td>Java Runtime</td>
+                <td>{{serverInfo.systemInfo.javaRuntime}}</td>
+            </tr>
+            <tr>
+                <td>Java VM</td>
+                <td>{{serverInfo.systemInfo.javaVm}}</td>
+            </tr>
+            <tr>
+                <td>Java VM Version</td>
+                <td>{{serverInfo.systemInfo.javaVmVersion}}</td>
+            </tr>
+            <tr>
+                <td>Java Home</td>
+                <td>{{serverInfo.systemInfo.javaHome}}</td>
+            </tr>
+            <tr>
+                <td>User Name</td>
+                <td>{{serverInfo.systemInfo.userName}}</td>
+            </tr>
+            <tr>
+                <td>User Timezone</td>
+                <td>{{serverInfo.systemInfo.userTimezone}}</td>
+            </tr>
+            <tr>
+                <td>User Locale</td>
+                <td>{{serverInfo.systemInfo.userLocale}}</td>
+            </tr>
+            <tr>
+                <td>System Encoding</td>
+                <td>{{serverInfo.systemInfo.fileEncoding}}</td>
+            </tr>
+            <tr>
+                <td>Operating System</td>
+                <td>{{serverInfo.systemInfo.osName}} {{serverInfo.systemInfo.osVersion}}</td>
+            </tr>
+            <tr>
+                <td>OS Architecture</td>
+                <td>{{serverInfo.systemInfo.osArchitecture}}</td>
+            </tr>
+        </table>
     </fieldset>
-</div>
\ No newline at end of file
+</div>
+
+<kc-menu></kc-menu>
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/server-info-providers.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/server-info-providers.html
new file mode 100755
index 0000000..aa95b50
--- /dev/null
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/server-info-providers.html
@@ -0,0 +1,55 @@
+<div class="col-sm-9 col-md-10 col-sm-push-3 col-md-push-2">
+    <h1>
+        Server Info
+        <i id="serverInfoReload" class="pficon  pficon-restart clickable" data-ng-click="serverInfoReload()"></i>
+    </h1>
+
+    <ul class="nav nav-tabs">
+        <li><a href="#/server-info">Info</a></li>
+        <li class="active"><a href="#/server-info/providers">Providers</a></li>
+    </ul>
+
+    <table class="table table-striped table-bordered">
+        <thead>
+        <tr>
+            <th class="kc-table-actions" colspan="5">
+                <div class="form-inline">
+                    <div class="form-group">
+                        <div class="input-group">
+                            <input type="text" placeholder="Search..." data-ng-model="search" class="form-control search" onkeyup="if(event.keyCode == 13){$(this).next('I').click();}">
+                        </div>
+                    </div>
+                </div>
+            </th>
+        </tr>
+        <tr>
+            <th width="20%">SPI</th>
+            <th>Providers</th>
+        </tr>
+        </thead>
+        <tbody>
+        <tr data-ng-repeat="spi in (providers | filter:search)">
+            <td>{{spi.name}}</td>
+            <td>
+                <div data-ng-repeat="(providerName, provider) in spi.providers">
+                    {{providerName}}
+                    <span ng-show="provider.operationalInfo">
+                        <button type="button" class="btn btn-default btn-xs" ng-click="collapseRep = !collapseRep">
+                            <span class="glyphicon glyphicon-plus" data-ng-show="!collapseRep"></span>
+                            <span class="glyphicon glyphicon-minus" data-ng-show="collapseRep"></span>
+                        </button>
+                        <table ng-show="collapseRep" class="table table-striped table-bordered" style="margin-top: 0px;">
+                            <tr ng-repeat="(key, value) in provider.operationalInfo">
+                                <td width="20%">{{key}}</td>
+                                <td>{{value}}</td>
+                            </tr>
+                        </table>
+                    </span>
+                </div>
+            </td>
+        </tr>
+        </tbody>
+    </table>
+</div>
+
+<kc-menu></kc-menu>
\ No newline at end of file
diff --git a/model/api/src/main/java/org/keycloak/migration/migrators/MigrateTo1_4_0.java b/model/api/src/main/java/org/keycloak/migration/migrators/MigrateTo1_4_0.java
index 5a8a6e0..daf8fe9 100755
--- a/model/api/src/main/java/org/keycloak/migration/migrators/MigrateTo1_4_0.java
+++ b/model/api/src/main/java/org/keycloak/migration/migrators/MigrateTo1_4_0.java
@@ -4,11 +4,13 @@ import org.keycloak.migration.ModelVersion;
 import org.keycloak.models.ImpersonationConstants;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
+import org.keycloak.models.UserFederationMapperModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.utils.DefaultAuthenticationFlows;
 import org.keycloak.models.utils.DefaultRequiredActions;
 import org.keycloak.models.utils.KeycloakModelUtils;
 
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -26,12 +28,24 @@ public class MigrateTo1_4_0 {
                 DefaultRequiredActions.addActions(realm);
             }
             ImpersonationConstants.setupImpersonationService(session, realm);
+
+            migrateLDAPMappers(session, realm);
             migrateUsers(session, realm);
         }
 
     }
 
-    public void migrateUsers(KeycloakSession session, RealmModel realm) {
+    private void migrateLDAPMappers(KeycloakSession session, RealmModel realm) {
+        List<String> mandatoryInLdap = Arrays.asList("username", "username-cn", "first name", "last name");
+        for (UserFederationMapperModel ldapMapper : realm.getUserFederationMappers()) {
+            if (mandatoryInLdap.contains(ldapMapper.getName())) {
+                ldapMapper.getConfig().put("is.mandatory.in.ldap", "true");
+                realm.updateUserFederationMapper(ldapMapper);
+            }
+        }
+    }
+
+    private void migrateUsers(KeycloakSession session, RealmModel realm) {
         List<UserModel> users = session.userStorage().getUsers(realm, false);
         for (UserModel user : users) {
             String email = user.getEmail();
diff --git a/model/api/src/main/java/org/keycloak/migration/ModelVersion.java b/model/api/src/main/java/org/keycloak/migration/ModelVersion.java
index d866320..93e7798 100755
--- a/model/api/src/main/java/org/keycloak/migration/ModelVersion.java
+++ b/model/api/src/main/java/org/keycloak/migration/ModelVersion.java
@@ -56,9 +56,24 @@ public class ModelVersion {
     }
 
     public boolean lessThan(ModelVersion version) {
-        if (major < version.major) return true;
-        if (minor < version.minor) return true;
-        if (micro < version.micro) return true;
+        if (major < version.major) {
+            return true;
+        } else if (major > version.major) {
+            return false;
+        }
+
+        if (minor < version.minor) {
+            return true;
+        } else if (minor > version.minor) {
+            return false;
+        }
+
+        if (micro < version.micro) {
+            return true;
+        } else if (minor > version.minor) {
+            return false;
+        }
+
         if (qualifier != null && qualifier.equals(version.qualifier)) return false;
         if (qualifier == null) return false;
         if (version.qualifier == null) return true;
diff --git a/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java b/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
index cbb3da2..8266550 100755
--- a/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
+++ b/model/api/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
@@ -18,6 +18,8 @@ public interface KeycloakSessionFactory extends ProviderEventManager {
     <T extends Provider> ProviderFactory<T> getProviderFactory(Class<T> clazz, String id);
 
     List<ProviderFactory> getProviderFactories(Class<? extends Provider> clazz);
+    
+    long getServerStartupTimestamp();
 
     void close();
 }
diff --git a/model/api/src/main/java/org/keycloak/models/LDAPConstants.java b/model/api/src/main/java/org/keycloak/models/LDAPConstants.java
index 1a32097..e935063 100644
--- a/model/api/src/main/java/org/keycloak/models/LDAPConstants.java
+++ b/model/api/src/main/java/org/keycloak/models/LDAPConstants.java
@@ -74,7 +74,7 @@ public class LDAPConstants {
     public static final String COMMA = ",";
     public static final String EQUAL = "=";
     public static final String EMPTY_ATTRIBUTE_VALUE = " ";
-    public static final String EMPTY_MEMBER_ATTRIBUTE_VALUE = "";
+    public static final String EMPTY_MEMBER_ATTRIBUTE_VALUE = "cn=empty-membership-placeholder";
 
     public static final String CUSTOM_ATTRIBUTE_ENABLED = "enabled";
     public static final String CUSTOM_ATTRIBUTE_CREATE_DATE = "createDate";
diff --git a/model/api/src/main/java/org/keycloak/provider/ServerInfoAwareProviderFactory.java b/model/api/src/main/java/org/keycloak/provider/ServerInfoAwareProviderFactory.java
new file mode 100644
index 0000000..97d17b1
--- /dev/null
+++ b/model/api/src/main/java/org/keycloak/provider/ServerInfoAwareProviderFactory.java
@@ -0,0 +1,20 @@
+package org.keycloak.provider;
+
+import java.util.Map;
+
+/**
+ * Marker interface for ProviderFactory of Provider which wants to show some info on "Server Info" page in Admin console.
+ * 
+ * @author Vlastimil Elias (velias at redhat dot com)
+ */
+public interface ServerInfoAwareProviderFactory<T extends Provider> extends ProviderFactory<T> {
+
+    /**
+     * Get operational info about given provider. This info contains informations about providers configuration and operational conditions (eg. errors in connection to remote systems etc) which is
+     * shown on "Server Info" page.
+     * 
+     * @return Map with keys describing value and relevant values itself
+     */
+    public Map<String, String> getOperationalInfo();
+
+}
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java
index aed1394..0702553 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java
@@ -172,6 +172,7 @@ public class DefaultCacheUserProvider implements CacheUserProvider {
 
     @Override
     public UserModel getUserByEmail(String email, RealmModel realm) {
+        if (email == null) return null;
         
         email = email.toLowerCase();
         
diff --git a/model/jpa/pom.xml b/model/jpa/pom.xml
index 51b5281..95ab185 100755
--- a/model/jpa/pom.xml
+++ b/model/jpa/pom.xml
@@ -44,7 +44,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java
index 3a63687..823a51b 100755
--- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java
@@ -1310,6 +1310,7 @@ public class RealmAdapter extends AbstractMongoAdapter<MongoRealmEntity> impleme
         model.setDescription(entity.getDescription());
         model.setBuiltIn(entity.isBuiltIn());
         model.setTopLevel(entity.isTopLevel());
+        model.setProviderId(entity.getProviderId());
         return model;
     }
 
diff --git a/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/ClientSessionAdapter.java b/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/ClientSessionAdapter.java
index 0dc6299..0b804b4 100755
--- a/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/ClientSessionAdapter.java
+++ b/model/sessions-infinispan/src/main/java/org/keycloak/models/sessions/infinispan/ClientSessionAdapter.java
@@ -178,7 +178,7 @@ public class ClientSessionAdapter implements ClientSessionModel {
         if (entity.getUserSessionNotes() == null) {
             entity.setUserSessionNotes(new HashMap<String, String>());
         }
-        entity.getNotes().put(name, value);
+        entity.getUserSessionNotes().put(name, value);
         update();
 
     }
diff --git a/model/sessions-jpa/pom.xml b/model/sessions-jpa/pom.xml
index f2e7b8e..9092a81 100755
--- a/model/sessions-jpa/pom.xml
+++ b/model/sessions-jpa/pom.xml
@@ -31,7 +31,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/model/sessions-jpa/src/main/java/org/keycloak/models/sessions/jpa/ClientSessionAdapter.java b/model/sessions-jpa/src/main/java/org/keycloak/models/sessions/jpa/ClientSessionAdapter.java
index 4c645c7..2f9e199 100755
--- a/model/sessions-jpa/src/main/java/org/keycloak/models/sessions/jpa/ClientSessionAdapter.java
+++ b/model/sessions-jpa/src/main/java/org/keycloak/models/sessions/jpa/ClientSessionAdapter.java
@@ -278,12 +278,22 @@ public class ClientSessionAdapter implements ClientSessionModel {
 
     @Override
     public void setExecutionStatus(String authenticator, ExecutionStatus status) {
-        ClientSessionAuthStatusEntity authStatus = new ClientSessionAuthStatusEntity();
-        authStatus.setAuthenticator(authenticator);
-        authStatus.setClientSession(entity);
-        authStatus.setStatus(status);
-        em.persist(authStatus);
-        entity.getAuthanticatorStatus().add(authStatus);
+        boolean exists = false;
+        for (ClientSessionAuthStatusEntity authStatus : entity.getAuthanticatorStatus()) {
+            if (authStatus.getAuthenticator().equals(authenticator)) {
+                authStatus.setStatus(status);
+                exists = true;
+            }
+        }
+
+        if (!exists) {
+            ClientSessionAuthStatusEntity authStatus = new ClientSessionAuthStatusEntity();
+            authStatus.setAuthenticator(authenticator);
+            authStatus.setClientSession(entity);
+            authStatus.setStatus(status);
+            em.persist(authStatus);
+            entity.getAuthanticatorStatus().add(authStatus);
+        }
         em.flush();
 
 
diff --git a/model/sessions-jpa/src/main/java/org/keycloak/models/sessions/jpa/JpaUserSessionProvider.java b/model/sessions-jpa/src/main/java/org/keycloak/models/sessions/jpa/JpaUserSessionProvider.java
index 20ac967..e8b460a 100755
--- a/model/sessions-jpa/src/main/java/org/keycloak/models/sessions/jpa/JpaUserSessionProvider.java
+++ b/model/sessions-jpa/src/main/java/org/keycloak/models/sessions/jpa/JpaUserSessionProvider.java
@@ -238,6 +238,14 @@ public class JpaUserSessionProvider implements UserSessionProvider {
                 .setParameter("realmId", realm.getId())
                 .setParameter("userId", user.getId())
                 .executeUpdate();
+        em.createNamedQuery("removeClientSessionAuthStatusByUser")
+                .setParameter("realmId", realm.getId())
+                .setParameter("userId", user.getId())
+                .executeUpdate();
+        em.createNamedQuery("removeClientUserSessionNoteByUser")
+                .setParameter("realmId", realm.getId())
+                .setParameter("userId", user.getId())
+                .executeUpdate();
         em.createNamedQuery("removeClientSessionByUser")
                 .setParameter("realmId", realm.getId())
                 .setParameter("userId", user.getId())
@@ -270,6 +278,14 @@ public class JpaUserSessionProvider implements UserSessionProvider {
                 .setParameter("realmId", realm.getId())
                 .setParameter("maxTime", dettachedClientSessionExpired)
                 .executeUpdate();
+        em.createNamedQuery("removeDetachedClientSessionAuthStatusByExpired")
+                .setParameter("realmId", realm.getId())
+                .setParameter("maxTime", dettachedClientSessionExpired)
+                .executeUpdate();
+        em.createNamedQuery("removeDetachedUserClientSessionNoteByExpired")
+                .setParameter("realmId", realm.getId())
+                .setParameter("maxTime", dettachedClientSessionExpired)
+                .executeUpdate();
         em.createNamedQuery("removeDetachedClientSessionByExpired")
                 .setParameter("realmId", realm.getId())
                 .setParameter("maxTime", dettachedClientSessionExpired)
@@ -289,6 +305,16 @@ public class JpaUserSessionProvider implements UserSessionProvider {
                 .setParameter("maxTime", maxTime)
                 .setParameter("idleTime", idleTime)
                 .executeUpdate();
+        em.createNamedQuery("removeClientSessionAuthStatusByExpired")
+                .setParameter("realmId", realm.getId())
+                .setParameter("maxTime", maxTime)
+                .setParameter("idleTime", idleTime)
+                .executeUpdate();
+        em.createNamedQuery("removeClientUserSessionNoteByExpired")
+                .setParameter("realmId", realm.getId())
+                .setParameter("maxTime", maxTime)
+                .setParameter("idleTime", idleTime)
+                .executeUpdate();
         em.createNamedQuery("removeClientSessionByExpired")
                 .setParameter("realmId", realm.getId())
                 .setParameter("maxTime", maxTime)
@@ -311,6 +337,8 @@ public class JpaUserSessionProvider implements UserSessionProvider {
         em.createNamedQuery("removeClientSessionNoteByRealm").setParameter("realmId", realm.getId()).executeUpdate();
         em.createNamedQuery("removeClientSessionRoleByRealm").setParameter("realmId", realm.getId()).executeUpdate();
         em.createNamedQuery("removeClientSessionProtMapperByRealm").setParameter("realmId", realm.getId()).executeUpdate();
+        em.createNamedQuery("removeClientSessionAuthStatusByRealm").setParameter("realmId", realm.getId()).executeUpdate();
+        em.createNamedQuery("removeClientUserSessionNoteByRealm").setParameter("realmId", realm.getId()).executeUpdate();
         em.createNamedQuery("removeClientSessionByRealm").setParameter("realmId", realm.getId()).executeUpdate();
         em.createNamedQuery("removeUserSessionNoteByRealm").setParameter("realmId", realm.getId()).executeUpdate();
         em.createNamedQuery("removeUserSessionByRealm").setParameter("realmId", realm.getId()).executeUpdate();
@@ -327,6 +355,8 @@ public class JpaUserSessionProvider implements UserSessionProvider {
         em.createNamedQuery("removeClientSessionNoteByClient").setParameter("realmId", realm.getId()).setParameter("clientId", client.getId()).executeUpdate();
         em.createNamedQuery("removeClientSessionRoleByClient").setParameter("realmId", realm.getId()).setParameter("clientId", client.getId()).executeUpdate();
         em.createNamedQuery("removeClientSessionProtMapperByClient").setParameter("realmId", realm.getId()).setParameter("clientId", client.getId()).executeUpdate();
+        em.createNamedQuery("removeClientSessionAuthStatusByClient").setParameter("realmId", realm.getId()).setParameter("clientId", client.getId()).executeUpdate();
+        em.createNamedQuery("removeClientUserSessionNoteByClient").setParameter("realmId", realm.getId()).setParameter("clientId", client.getId()).executeUpdate();
         em.createNamedQuery("removeClientSessionByClient").setParameter("realmId", realm.getId()).setParameter("clientId", client.getId()).executeUpdate();
     }
 

pom.xml 46(+6 -40)

diff --git a/pom.xml b/pom.xml
index 0f74602..1a8be07 100755
--- a/pom.xml
+++ b/pom.xml
@@ -28,9 +28,7 @@
         <apache.httpcomponents.httpcore.version>4.3.3</apache.httpcomponents.httpcore.version>
         <resteasy.version>2.3.7.Final</resteasy.version>
         <resteasy.latest.version>3.0.9.Final</resteasy.latest.version>
-        <joda-time.version>2.7</joda-time.version>
         <keycloak.apache.httpcomponents.version>4.2.1</keycloak.apache.httpcomponents.version>
-        <!-- <undertow.version>1.1.0.Final</undertow.version> -->
         <undertow.version>1.1.1.Final</undertow.version>
         <picketlink.version>2.7.0.Final</picketlink.version>
         <mongo.driver.version>2.11.3</mongo.driver.version>
@@ -40,23 +38,21 @@
         <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>
         <io.netty.version>4.0.26.Final</io.netty.version> 
         <xnio.netty.netty-xnio-transport.version>0.1.1.Final</xnio.netty.netty-xnio-transport.version>
-        <hibernate.javax.persistence.version>1.0.1.Final</hibernate.javax.persistence.version>
-        <hibernate.entitymanager.version>4.0.1.Final</hibernate.entitymanager.version>
+        <hibernate.javax.persistence.version>1.0.0.Final</hibernate.javax.persistence.version>
+        <hibernate.entitymanager.version>4.3.10.Final</hibernate.entitymanager.version>
         <h2.version>1.4.187</h2.version>
         <mysql.version>5.1.29</mysql.version>
         <postgresql.version>9.3-1100-jdbc41</postgresql.version>
         <dom4j.version>1.6.1</dom4j.version>
         <xml-apis.version>1.4.01</xml-apis.version>
         <slf4j.version>1.7.7</slf4j.version>
-        <wildfly.version>9.0.0.Final</wildfly.version>
-        <wildfly.core.version>1.0.0.Final</wildfly.core.version>
-        <wildfly.build-tools.version>1.0.0.Alpha8</wildfly.build-tools.version>
+        <wildfly.version>9.0.1.Final</wildfly.version>
+        <wildfly.core.version>1.0.1.Final</wildfly.core.version>
+        <wildfly.build-tools.version>1.0.0.Final</wildfly.build-tools.version>
 
         <!-- this is EAP 6.4 alpha, publicly available -->
         <jboss.version>7.5.0.Final-redhat-15</jboss.version>
 
-        <!--jboss.version>7.1.1.Final</jboss.version-->
-
         <servlet.api.30.version>1.0.2.Final</servlet.api.30.version>
         <google.zxing.version>2.2</google.zxing.version>
         <google.client.version>1.14.1-beta</google.client.version>
@@ -186,36 +182,6 @@
                 <version>${sun.xsom.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>jaxb-core</artifactId>
-                <version>${sun.jaxb.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>jaxb-runtime</artifactId>
-                <version>${sun.jaxb.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>jaxb-xjc</artifactId>
-                <version>${sun.jaxb.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>codemodel</artifactId>
-                <version>${sun.jaxb.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.glassfish.jaxb</groupId>
-                <artifactId>txw2</artifactId>
-                <version>${sun.jaxb.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>joda-time</groupId>
-                <artifactId>joda-time</artifactId>
-                <version>${joda-time.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>org.bouncycastle</groupId>
                 <artifactId>bcprov-jdk15on</artifactId>
                 <version>${bouncycastle.crypto.version}</version>
@@ -356,7 +322,7 @@
             </dependency>
             <dependency>
                 <groupId>org.hibernate.javax.persistence</groupId>
-                <artifactId>hibernate-jpa-2.0-api</artifactId>
+                <artifactId>hibernate-jpa-2.1-api</artifactId>
                 <version>${hibernate.javax.persistence.version}</version>
             </dependency>
             <dependency>
diff --git a/services/src/main/java/org/keycloak/authentication/authenticators/browser/AbstractFormAuthenticator.java b/services/src/main/java/org/keycloak/authentication/authenticators/browser/AbstractFormAuthenticator.java
index 5e16237..9ac6f07 100755
--- a/services/src/main/java/org/keycloak/authentication/authenticators/browser/AbstractFormAuthenticator.java
+++ b/services/src/main/java/org/keycloak/authentication/authenticators/browser/AbstractFormAuthenticator.java
@@ -163,7 +163,7 @@ public abstract class AbstractFormAuthenticator implements Authenticator {
     public boolean validatePassword(AuthenticatorContext context, MultivaluedMap<String, String> inputData) {
         List<UserCredentialModel> credentials = new LinkedList<>();
         String password = inputData.getFirst(CredentialRepresentation.PASSWORD);
-        if (password == null) {
+        if (password == null || password.isEmpty()) {
             if (context.getUser() != null) {
                 context.getEvent().user(context.getUser());
             }
diff --git a/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java b/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
index e312aa0..c5be21b 100755
--- a/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
+++ b/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
@@ -28,6 +28,8 @@ public class DefaultKeycloakSessionFactory implements KeycloakSessionFactory {
     private Map<Class<? extends Provider>, Map<String, ProviderFactory>> factoriesMap = new HashMap<Class<? extends Provider>, Map<String, ProviderFactory>>();
     protected CopyOnWriteArrayList<ProviderEventListener> listeners = new CopyOnWriteArrayList<ProviderEventListener>();
 
+    protected long serverStartupTimestamp;
+    
     @Override
     public void register(ProviderEventListener listener) {
         listeners.add(listener);
@@ -46,6 +48,8 @@ public class DefaultKeycloakSessionFactory implements KeycloakSessionFactory {
     }
 
     public void init() {
+        serverStartupTimestamp = System.currentTimeMillis();
+        
         ProviderManager pm = new ProviderManager(getClass().getClassLoader(), Config.scope().getArray("providers"));
 
         for (Spi spi : ServiceLoader.load(Spi.class, getClass().getClassLoader())) {
@@ -148,4 +152,12 @@ public class DefaultKeycloakSessionFactory implements KeycloakSessionFactory {
         return factory.getClass().getPackage().getName().startsWith("org.keycloak");
     }
 
+    /**
+     * @return timestamp of Keycloak server startup
+     */
+    @Override
+    public long getServerStartupTimestamp() {
+        return serverStartupTimestamp;
+    }
+
 }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
index e1d1fa3..97c1472 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
@@ -20,6 +20,7 @@ import org.keycloak.services.managers.AppAuthManager;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.resources.Cors;
+import org.keycloak.services.resources.admin.info.ServerInfoAdminResource;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/info/MemoryInfoRepresentation.java b/services/src/main/java/org/keycloak/services/resources/admin/info/MemoryInfoRepresentation.java
new file mode 100644
index 0000000..56a1110
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/admin/info/MemoryInfoRepresentation.java
@@ -0,0 +1,54 @@
+package org.keycloak.services.resources.admin.info;
+
+public class MemoryInfoRepresentation {
+
+    protected long total;
+    protected long used;
+
+    public static MemoryInfoRepresentation create() {
+        MemoryInfoRepresentation rep = new MemoryInfoRepresentation();
+        Runtime runtime = Runtime.getRuntime();
+        rep.total = runtime.maxMemory();
+        rep.used = runtime.totalMemory() - runtime.freeMemory();
+        return rep;
+    }
+
+    public long getTotal() {
+        return total;
+    }
+
+    public String getTotalFormated() {
+        return formatMemory(getTotal());
+    }
+
+    public long getFree() {
+        return getTotal() - getUsed();
+    }
+
+    public String getFreeFormated() {
+        return formatMemory(getFree());
+    }
+
+    public long getUsed() {
+        return used;
+    }
+
+    public String getUsedFormated() {
+        return formatMemory(getUsed());
+    }
+
+    public long getFreePercentage() {
+        return getFree() * 100 / getTotal();
+    }
+
+    private String formatMemory(long bytes) {
+        if (bytes > 1024L * 1024L) {
+            return bytes / (1024L * 1024L) + " MB";
+        } else if (bytes > 1024L) {
+            return bytes / (1024L) + " kB";
+        } else {
+            return bytes + " B";
+        }
+    }
+
+}
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/info/ProviderRepresentation.java b/services/src/main/java/org/keycloak/services/resources/admin/info/ProviderRepresentation.java
new file mode 100644
index 0000000..ffcaeb1
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/admin/info/ProviderRepresentation.java
@@ -0,0 +1,17 @@
+package org.keycloak.services.resources.admin.info;
+
+import java.util.Map;
+
+public class ProviderRepresentation {
+
+    private Map<String, String> operationalInfo;
+
+    public Map<String, String> getOperationalInfo() {
+        return operationalInfo;
+    }
+
+    public void setOperationalInfo(Map<String, String> operationalInfo) {
+        this.operationalInfo = operationalInfo;
+    }
+
+}
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/info/ServerInfoRepresentation.java b/services/src/main/java/org/keycloak/services/resources/admin/info/ServerInfoRepresentation.java
new file mode 100644
index 0000000..9b7f4f5
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/admin/info/ServerInfoRepresentation.java
@@ -0,0 +1,108 @@
+package org.keycloak.services.resources.admin.info;
+
+import org.keycloak.representations.idm.ProtocolMapperRepresentation;
+import org.keycloak.representations.idm.ProtocolMapperTypeRepresentation;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+public class ServerInfoRepresentation {
+
+    private SystemInfoRepresentation systemInfo;
+    private MemoryInfoRepresentation memoryInfo;
+
+    private Map<String, List<String>> themes;
+
+    private List<Map<String, String>> socialProviders;
+    private List<Map<String, String>> identityProviders;
+    private List<Map<String, String>> clientImporters;
+
+    private Map<String, SpiInfoRepresentation> providers;
+
+    private Map<String, List<ProtocolMapperTypeRepresentation>> protocolMapperTypes;
+    private Map<String, List<ProtocolMapperRepresentation>> builtinProtocolMappers;
+
+    private Map<String, List<String>> enums;
+
+    public SystemInfoRepresentation getSystemInfo() {
+        return systemInfo;
+    }
+
+    public void setSystemInfo(SystemInfoRepresentation systemInfo) {
+        this.systemInfo = systemInfo;
+    }
+
+    public MemoryInfoRepresentation getMemoryInfo() {
+        return memoryInfo;
+    }
+
+    public void setMemoryInfo(MemoryInfoRepresentation memoryInfo) {
+        this.memoryInfo = memoryInfo;
+    }
+    public Map<String, List<String>> getThemes() {
+        return themes;
+    }
+
+    public void setThemes(Map<String, List<String>> themes) {
+        this.themes = themes;
+    }
+
+    public List<Map<String, String>> getSocialProviders() {
+        return socialProviders;
+    }
+
+    public void setSocialProviders(List<Map<String, String>> socialProviders) {
+        this.socialProviders = socialProviders;
+    }
+
+    public List<Map<String, String>> getIdentityProviders() {
+        return identityProviders;
+    }
+
+    public void setIdentityProviders(List<Map<String, String>> identityProviders) {
+        this.identityProviders = identityProviders;
+    }
+
+    public List<Map<String, String>> getClientImporters() {
+        return clientImporters;
+    }
+
+    public void setClientImporters(List<Map<String, String>> clientImporters) {
+        this.clientImporters = clientImporters;
+    }
+
+    public Map<String, SpiInfoRepresentation> getProviders() {
+        return providers;
+    }
+
+    public void setProviders(Map<String, SpiInfoRepresentation> providers) {
+        this.providers = providers;
+    }
+
+    public Map<String, List<ProtocolMapperTypeRepresentation>> getProtocolMapperTypes() {
+        return protocolMapperTypes;
+    }
+
+    public void setProtocolMapperTypes(Map<String, List<ProtocolMapperTypeRepresentation>> protocolMapperTypes) {
+        this.protocolMapperTypes = protocolMapperTypes;
+    }
+
+    public Map<String, List<ProtocolMapperRepresentation>> getBuiltinProtocolMappers() {
+        return builtinProtocolMappers;
+    }
+
+    public void setBuiltinProtocolMappers(Map<String, List<ProtocolMapperRepresentation>> builtinProtocolMappers) {
+        this.builtinProtocolMappers = builtinProtocolMappers;
+    }
+
+    public Map<String, List<String>> getEnums() {
+        return enums;
+    }
+
+    public void setEnums(Map<String, List<String>> enums) {
+        this.enums = enums;
+    }
+}
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/info/SpiInfoRepresentation.java b/services/src/main/java/org/keycloak/services/resources/admin/info/SpiInfoRepresentation.java
new file mode 100644
index 0000000..3f94a5a
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/admin/info/SpiInfoRepresentation.java
@@ -0,0 +1,39 @@
+package org.keycloak.services.resources.admin.info;
+
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+public class SpiInfoRepresentation {
+
+    private boolean internal;
+    private boolean systemInfo;
+
+    private Map<String, ProviderRepresentation> providers;
+
+    public boolean isInternal() {
+        return internal;
+    }
+
+    public void setInternal(boolean internal) {
+        this.internal = internal;
+    }
+
+    public boolean isSystemInfo() {
+        return systemInfo;
+    }
+
+    public void setSystemInfo(boolean systemInfo) {
+        this.systemInfo = systemInfo;
+    }
+
+    public Map<String, ProviderRepresentation> getProviders() {
+        return providers;
+    }
+
+    public void setProviders(Map<String, ProviderRepresentation> providers) {
+        this.providers = providers;
+    }
+
+}
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/info/SystemInfoRepresentation.java b/services/src/main/java/org/keycloak/services/resources/admin/info/SystemInfoRepresentation.java
new file mode 100644
index 0000000..bc0329a
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/admin/info/SystemInfoRepresentation.java
@@ -0,0 +1,217 @@
+package org.keycloak.services.resources.admin.info;
+
+import org.keycloak.Version;
+import org.keycloak.models.KeycloakSession;
+
+import java.util.Date;
+import java.util.Locale;
+
+public class SystemInfoRepresentation {
+
+    private String version;
+    private String serverTime;
+    private String uptime;
+    private long uptimeMillis;
+    private String javaVersion;
+    private String javaVendor;
+    private String javaVm;
+    private String javaVmVersion;
+    private String javaRuntime;
+    private String javaHome;
+    private String osName;
+    private String osArchitecture;
+    private String osVersion;
+    private String fileEncoding;
+    private String userName;
+    private String userDir;
+    private String userTimezone;
+    private String userLocale;
+
+    public static SystemInfoRepresentation create(KeycloakSession session) {
+        SystemInfoRepresentation rep = new SystemInfoRepresentation();
+        rep.version = Version.VERSION;
+        rep.serverTime = new Date().toString();
+        rep.uptimeMillis = System.currentTimeMillis() - session.getKeycloakSessionFactory().getServerStartupTimestamp();
+        rep.uptime = formatUptime(rep.uptimeMillis);
+        rep.javaVersion = System.getProperty("java.version");
+        rep.javaVendor = System.getProperty("java.vendor");
+        rep.javaVm = System.getProperty("java.vm.name");
+        rep.javaVmVersion = System.getProperty("java.vm.version");
+        rep.javaRuntime = System.getProperty("java.runtime.name");
+        rep.javaHome = System.getProperty("java.home");
+        rep.osName = System.getProperty("os.name");
+        rep.osArchitecture = System.getProperty("os.arch");
+        rep.osVersion = System.getProperty("os.version");
+        rep.fileEncoding = System.getProperty("file.encoding");
+        rep.userName = System.getProperty("user.name");
+        rep.userDir = System.getProperty("user.dir");
+        rep.userTimezone = System.getProperty("user.timezone");
+        rep.userLocale = (new Locale(System.getProperty("user.country"), System.getProperty("user.language")).toString());
+        return rep;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getServerTime() {
+        return serverTime;
+    }
+
+    public void setServerTime(String serverTime) {
+        this.serverTime = serverTime;
+    }
+
+    public String getUptime() {
+        return uptime;
+    }
+
+    public void setUptime(String uptime) {
+        this.uptime = uptime;
+    }
+
+    public long getUptimeMillis() {
+        return uptimeMillis;
+    }
+
+    public void setUptimeMillis(long uptimeMillis) {
+        this.uptimeMillis = uptimeMillis;
+    }
+
+    public String getJavaVersion() {
+        return javaVersion;
+    }
+
+    public void setJavaVersion(String javaVersion) {
+        this.javaVersion = javaVersion;
+    }
+
+    public String getJavaVendor() {
+        return javaVendor;
+    }
+
+    public void setJavaVendor(String javaVendor) {
+        this.javaVendor = javaVendor;
+    }
+
+    public String getJavaVm() {
+        return javaVm;
+    }
+
+    public void setJavaVm(String javaVm) {
+        this.javaVm = javaVm;
+    }
+
+    public String getJavaVmVersion() {
+        return javaVmVersion;
+    }
+
+    public void setJavaVmVersion(String javaVmVersion) {
+        this.javaVmVersion = javaVmVersion;
+    }
+
+    public String getJavaRuntime() {
+        return javaRuntime;
+    }
+
+    public void setJavaRuntime(String javaRuntime) {
+        this.javaRuntime = javaRuntime;
+    }
+
+    public String getJavaHome() {
+        return javaHome;
+    }
+
+    public void setJavaHome(String javaHome) {
+        this.javaHome = javaHome;
+    }
+
+    public String getOsName() {
+        return osName;
+    }
+
+    public void setOsName(String osName) {
+        this.osName = osName;
+    }
+
+    public String getOsArchitecture() {
+        return osArchitecture;
+    }
+
+    public void setOsArchitecture(String osArchitecture) {
+        this.osArchitecture = osArchitecture;
+    }
+
+    public String getOsVersion() {
+        return osVersion;
+    }
+
+    public void setOsVersion(String osVersion) {
+        this.osVersion = osVersion;
+    }
+
+    public String getFileEncoding() {
+        return fileEncoding;
+    }
+
+    public void setFileEncoding(String fileEncoding) {
+        this.fileEncoding = fileEncoding;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserDir() {
+        return userDir;
+    }
+
+    public void setUserDir(String userDir) {
+        this.userDir = userDir;
+    }
+
+    public String getUserTimezone() {
+        return userTimezone;
+    }
+
+    public void setUserTimezone(String userTimezone) {
+        this.userTimezone = userTimezone;
+    }
+
+    public String getUserLocale() {
+        return userLocale;
+    }
+
+    public void setUserLocale(String userLocale) {
+        this.userLocale = userLocale;
+    }
+
+    private static String formatUptime(long uptime) {
+        long diffInSeconds = uptime / 1000;
+        long diff[] = new long[]{0, 0, 0, 0}; // sec
+        diff[3] = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds); // min
+        diff[2] = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds; // hours
+        diff[1] = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds; // days
+        diff[0] = (diffInSeconds = (diffInSeconds / 24));
+
+        return String.format(
+                "%d day%s, %d hour%s, %d minute%s, %d second%s",
+                diff[0],
+                diff[0] != 1 ? "s" : "",
+                diff[1],
+                diff[1] != 1 ? "s" : "",
+                diff[2],
+                diff[2] != 1 ? "s" : "",
+                diff[3],
+                diff[3] != 1 ? "s" : "");
+    }
+
+}
diff --git a/testsuite/integration/pom.xml b/testsuite/integration/pom.xml
index ae85538..c35698d 100755
--- a/testsuite/integration/pom.xml
+++ b/testsuite/integration/pom.xml
@@ -143,7 +143,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/AdminAPITest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/AdminAPITest.java
index 3bde1cb..dc49661 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/AdminAPITest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/admin/AdminAPITest.java
@@ -25,6 +25,7 @@ import org.junit.Assert;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.keycloak.Config;
+import org.keycloak.Version;
 import org.keycloak.models.ClientModel;
 import org.keycloak.models.ClientSessionModel;
 import org.keycloak.models.Constants;
@@ -55,6 +56,7 @@ import javax.ws.rs.core.UriBuilder;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -295,4 +297,37 @@ public class AdminAPITest {
         testCreateRealm("/admin-test/testrealm.json");
     }
 
+    @Test
+    public void testServerInfo() {
+        String token = createToken();
+        final String authHeader = "Bearer " + token;
+        ClientRequestFilter authFilter = new ClientRequestFilter() {
+            @Override
+            public void filter(ClientRequestContext requestContext) throws IOException {
+                requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, authHeader);
+            }
+        };
+        Client client = ClientBuilder.newBuilder().register(authFilter).build();
+        UriBuilder authBase = UriBuilder.fromUri("http://localhost:8081/auth");
+        WebTarget target = client.target(AdminRoot.adminBaseUrl(authBase).path("serverinfo"));
+
+        Map<?, ?> response = target.request().accept("application/json").get(Map.class);
+
+
+        System.out.println(response.keySet().toString());
+
+        Assert.assertNotNull(response);
+        Assert.assertNotNull(response.get("providers"));
+        Assert.assertNotNull(response.get("themes"));
+        Assert.assertNotNull(response.get("enums"));
+
+        Assert.assertNotNull(response.get("memoryInfo"));
+        Assert.assertNotNull(response.get("systemInfo"));
+
+        Map<?, ?> systemInfo = (Map<?, ?>) response.get("systemInfo");
+        Assert.assertEquals(Version.VERSION, systemInfo.get("version"));
+        Assert.assertNotNull(systemInfo.get("serverTime"));
+        Assert.assertNotNull(systemInfo.get("uptime"));
+    }
+
 }
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/FederationProvidersIntegrationTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/FederationProvidersIntegrationTest.java
index b91ee08..8c33f9f 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/FederationProvidersIntegrationTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/FederationProvidersIntegrationTest.java
@@ -9,6 +9,7 @@ import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
 import org.junit.runners.MethodSorters;
 import org.keycloak.OAuth2Constants;
+import org.keycloak.federation.ldap.LDAPConfig;
 import org.keycloak.federation.ldap.LDAPFederationProvider;
 import org.keycloak.federation.ldap.LDAPFederationProviderFactory;
 import org.keycloak.federation.ldap.idm.model.LDAPObject;
@@ -56,7 +57,7 @@ public class FederationProvidersIntegrationTest {
 
         @Override
         public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
-            FederationTestUtils.addLocalUser(manager.getSession(), appRealm, "mary", "mary@test.com", "password-app");
+            FederationTestUtils.addLocalUser(manager.getSession(), appRealm, "marykeycloak", "mary@test.com", "password-app");
 
             Map<String,String> ldapConfig = ldapRule.getConfig();
             ldapConfig.put(LDAPConstants.SYNC_REGISTRATIONS, "true");
@@ -121,22 +122,22 @@ public class FederationProvidersIntegrationTest {
             RealmModel appRealm = manager.getRealm("test");
             LDAPFederationProvider ldapFedProvider = FederationTestUtils.getLdapProvider(session, ldapModel);
             LDAPObject jbrown2 = FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "JBrown2", "John", "Brown2", "jbrown2@email.org", null, "1234");
-            ldapFedProvider.getLdapIdentityStore().updatePassword(jbrown2, "password");
+            ldapFedProvider.getLdapIdentityStore().updatePassword(jbrown2, "Password1");
             LDAPObject jbrown3 = FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "jbrown3", "John", "Brown3", "JBrown3@email.org", null, "1234");
-            ldapFedProvider.getLdapIdentityStore().updatePassword(jbrown3, "password");
+            ldapFedProvider.getLdapIdentityStore().updatePassword(jbrown3, "Password1");
         } finally {
             keycloakRule.stopSession(session, true);
         }
 
-        loginSuccessAndLogout("jbrown2", "password");
-        loginSuccessAndLogout("JBrown2", "password");
-        loginSuccessAndLogout("jbrown2@email.org", "password");
-        loginSuccessAndLogout("JBrown2@email.org", "password");
+        loginSuccessAndLogout("jbrown2", "Password1");
+        loginSuccessAndLogout("JBrown2", "Password1");
+        loginSuccessAndLogout("jbrown2@email.org", "Password1");
+        loginSuccessAndLogout("JBrown2@email.org", "Password1");
 
-        loginSuccessAndLogout("jbrown3", "password");
-        loginSuccessAndLogout("JBrown3", "password");
-        loginSuccessAndLogout("jbrown3@email.org", "password");
-        loginSuccessAndLogout("JBrown3@email.org", "password");
+        loginSuccessAndLogout("jbrown3", "Password1");
+        loginSuccessAndLogout("JBrown3", "Password1");
+        loginSuccessAndLogout("jbrown3@email.org", "Password1");
+        loginSuccessAndLogout("JBrown3@email.org", "Password1");
     }
 
     private void loginSuccessAndLogout(String username, String password) {
@@ -155,9 +156,9 @@ public class FederationProvidersIntegrationTest {
             RealmModel appRealm = manager.getRealm("test");
             LDAPFederationProvider ldapFedProvider = FederationTestUtils.getLdapProvider(session, ldapModel);
             LDAPObject jbrown2 = FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "JBrown4", "John", "Brown4", "jbrown4@email.org", null, "1234");
-            ldapFedProvider.getLdapIdentityStore().updatePassword(jbrown2, "password");
+            ldapFedProvider.getLdapIdentityStore().updatePassword(jbrown2, "Password1");
             LDAPObject jbrown3 = FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "jbrown5", "John", "Brown5", "JBrown5@Email.org", null, "1234");
-            ldapFedProvider.getLdapIdentityStore().updatePassword(jbrown3, "password");
+            ldapFedProvider.getLdapIdentityStore().updatePassword(jbrown3, "Password1");
         } finally {
             keycloakRule.stopSession(session, true);
         }
@@ -225,7 +226,7 @@ public class FederationProvidersIntegrationTest {
     @Test
     public void loginClassic() {
         loginPage.open();
-        loginPage.login("mary", "password-app");
+        loginPage.login("marykeycloak", "password-app");
 
         Assert.assertEquals(AppPage.RequestType.AUTH_RESPONSE, appPage.getRequestType());
         Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE));
@@ -352,6 +353,35 @@ public class FederationProvidersIntegrationTest {
     }
 
     @Test
+    public void testDotInUsername() {
+        KeycloakSession session = keycloakRule.startSession();
+        boolean skip = false;
+
+        try {
+            RealmModel appRealm = new RealmManager(session).getRealmByName("test");
+            LDAPFederationProvider ldapFedProvider = FederationTestUtils.getLdapProvider(session, ldapModel);
+
+            // Workaround as dot is not allowed in sAMAccountName on active directory. So we will skip the test for this configuration
+            LDAPConfig config = ldapFedProvider.getLdapIdentityStore().getConfig();
+            if (config.isActiveDirectory() && config.getUsernameLdapAttribute().equals(LDAPConstants.SAM_ACCOUNT_NAME)) {
+                skip = true;
+            }
+
+            if (!skip) {
+                LDAPObject johnDot = FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "john,dot", "John", "Dot", "johndot@email.org", null, "12387");
+                ldapFedProvider.getLdapIdentityStore().updatePassword(johnDot, "Password1");
+            }
+        } finally {
+            keycloakRule.stopSession(session, false);
+        }
+
+        if (!skip) {
+            // Try to import the user with dot in username into Keycloak
+            loginSuccessAndLogout("john,dot", "Password1");
+        }
+    }
+
+    @Test
     public void testDirectLDAPUpdate() {
         KeycloakSession session = keycloakRule.startSession();
 
@@ -488,8 +518,10 @@ public class FederationProvidersIntegrationTest {
             @Override
             public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
                 LDAPFederationProvider ldapFedProvider = FederationTestUtils.getLdapProvider(session, ldapModel);
-                FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "mary", "Mary1", "Kelly1", "mary1@email.org", null, "123");
+                FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "marykeycloak", "Mary1", "Kelly1", "mary1@email.org", null, "123");
                 FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "mary-duplicatemail", "Mary2", "Kelly2", "mary@test.com", null, "123");
+                LDAPObject marynoemail = FederationTestUtils.addLDAPUser(ldapFedProvider, appRealm, "marynoemail", "Mary1", "Kelly1", null, null, "123");
+                ldapFedProvider.getLdapIdentityStore().updatePassword(marynoemail, "Password1");
             }
 
         });
@@ -501,6 +533,8 @@ public class FederationProvidersIntegrationTest {
 
         loginPage.login("mary1@email.org", "password");
         Assert.assertEquals("Username already exists.", loginPage.getError());
+
+        loginSuccessAndLogout("marynoemail", "Password1");
     }
 
     @Test
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/SyncProvidersTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/SyncProvidersTest.java
index 9b03d5b..e5e893a 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/SyncProvidersTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/SyncProvidersTest.java
@@ -211,10 +211,18 @@ public class SyncProvidersTest {
             // Assert user successfully synced now
             result = new UsersSyncManager().syncAllUsers(session.getKeycloakSessionFactory(), "test", ldapModel);
             Assert.assertEquals(0, result.getFailed());
-            FederationTestUtils.assertUserImported(session.userStorage(), testRealm, "user7-something", "User7FNN", "User7LNL", "user7-changed@email.org", "126");
         } finally {
             keycloakRule.stopSession(session, true);
         }
+
+        // Assert user imported in another transaction
+        session = keycloakRule.startSession();
+        try {
+            RealmModel testRealm = session.realms().getRealm("test");
+            FederationTestUtils.assertUserImported(session.userStorage(), testRealm, "user7-something", "User7FNN", "User7LNL", "user7-changed@email.org", "126");
+        } finally {
+            keycloakRule.stopSession(session, false);
+        }
     }
 
     // KEYCLOAK-1571
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/MigrationVersionTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/MigrationVersionTest.java
index e119c03..4e5039a 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/MigrationVersionTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/MigrationVersionTest.java
@@ -21,10 +21,12 @@ public class MigrationVersionTest {
         ModelVersion version_110Beta1 = new ModelVersion("1.1.0.Beta1");
         ModelVersion version_110CR1 = new ModelVersion("1.1.0.CR1");
         ModelVersion version_110 = new ModelVersion("1.1.0");
-        ModelVersion version_111Beta1 = new ModelVersion("1.1.1.Beta1");
-        ModelVersion version_111CR1 = new ModelVersion("1.1.1.CR1");
-        ModelVersion version_111 = new ModelVersion("1.1.1");
-        ModelVersion version_211Beta1 = new ModelVersion("2.1.1.Beta1");
+
+        ModelVersion version_120CR1 = new ModelVersion("1.2.0.CR1");
+        ModelVersion version_130Beta1 = new ModelVersion("1.3.0.Beta1");
+        ModelVersion version_130 = new ModelVersion("1.3.0");
+        ModelVersion version_140 = new ModelVersion("1.4.0");
+
         ModelVersion version_211CR1 = new ModelVersion("2.1.1.CR1");
         Assert.assertEquals(version_211CR1.getMajor(), 2);
         Assert.assertEquals(version_211CR1.getMinor(), 1);
@@ -38,6 +40,12 @@ public class MigrationVersionTest {
         Assert.assertTrue(version_100Beta1.lessThan(version_110Beta1));
         Assert.assertTrue(version_100Beta1.lessThan(version_110CR1));
         Assert.assertTrue(version_100Beta1.lessThan(version_110));
+        Assert.assertFalse(version_110Beta1.lessThan(version_100CR1));
+        Assert.assertFalse(version_130Beta1.lessThan(version_120CR1));
+        Assert.assertTrue(version_130Beta1.lessThan(version_130));
+        Assert.assertTrue(version_130Beta1.lessThan(version_140));
+        Assert.assertFalse(version_211CR1.lessThan(version_140));
+        Assert.assertTrue(version_140.lessThan(version_211CR1));
 
         Assert.assertFalse(version_211.lessThan(version_110CR1));
 
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserModelTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserModelTest.java
index 9455271..8fbfdce 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserModelTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/UserModelTest.java
@@ -193,7 +193,7 @@ public class UserModelTest extends AbstractModelTest {
         Assert.assertEquals("val23", attrVals.get(0));
     }
 
-    @Test
+    // @Test
     public void testSearchByUserAttributes() throws Exception {
         RealmModel realm = realmManager.createRealm("original");
         UserModel user1 = session.users().addUser(realm, "user1");
diff --git a/testsuite/jetty/jetty81/pom.xml b/testsuite/jetty/jetty81/pom.xml
index b4c6579..875a6b4 100755
--- a/testsuite/jetty/jetty81/pom.xml
+++ b/testsuite/jetty/jetty81/pom.xml
@@ -144,7 +144,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/testsuite/jetty/jetty91/pom.xml b/testsuite/jetty/jetty91/pom.xml
index b468581..9e41cc8 100755
--- a/testsuite/jetty/jetty91/pom.xml
+++ b/testsuite/jetty/jetty91/pom.xml
@@ -144,7 +144,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/testsuite/jetty/jetty92/pom.xml b/testsuite/jetty/jetty92/pom.xml
index 1f9d5f3..7332b0f 100755
--- a/testsuite/jetty/jetty92/pom.xml
+++ b/testsuite/jetty/jetty92/pom.xml
@@ -144,7 +144,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/testsuite/performance/pom.xml b/testsuite/performance/pom.xml
index 77a5a72..1c832cf 100755
--- a/testsuite/performance/pom.xml
+++ b/testsuite/performance/pom.xml
@@ -193,7 +193,7 @@
 
                             <dependency>
                                 <groupId>org.hibernate.javax.persistence</groupId>
-                                <artifactId>hibernate-jpa-2.0-api</artifactId>
+                                <artifactId>hibernate-jpa-2.1-api</artifactId>
                                 <version>${hibernate.javax.persistence.version}</version>
                             </dependency>
                             <dependency>
diff --git a/testsuite/proxy/pom.xml b/testsuite/proxy/pom.xml
index 69e8e92..ea170ca 100755
--- a/testsuite/proxy/pom.xml
+++ b/testsuite/proxy/pom.xml
@@ -139,7 +139,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/testsuite/tomcat6/pom.xml b/testsuite/tomcat6/pom.xml
index 3fd85d4..e874e6a 100755
--- a/testsuite/tomcat6/pom.xml
+++ b/testsuite/tomcat6/pom.xml
@@ -134,7 +134,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/testsuite/tomcat7/pom.xml b/testsuite/tomcat7/pom.xml
index 5255f93..7e7b931 100755
--- a/testsuite/tomcat7/pom.xml
+++ b/testsuite/tomcat7/pom.xml
@@ -150,7 +150,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/testsuite/tomcat8/pom.xml b/testsuite/tomcat8/pom.xml
index 1a7ac3c..70e64f7 100755
--- a/testsuite/tomcat8/pom.xml
+++ b/testsuite/tomcat8/pom.xml
@@ -134,7 +134,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/testsuite/wildfly/pom.xml b/testsuite/wildfly/pom.xml
index a77104e..8f494bc 100644
--- a/testsuite/wildfly/pom.xml
+++ b/testsuite/wildfly/pom.xml
@@ -141,7 +141,7 @@
         </dependency>
         <dependency>
             <groupId>org.hibernate.javax.persistence</groupId>
-            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/util/embedded-ldap/pom.xml b/util/embedded-ldap/pom.xml
index 6eeeece..5a1e927 100644
--- a/util/embedded-ldap/pom.xml
+++ b/util/embedded-ldap/pom.xml
@@ -28,8 +28,13 @@
             <artifactId>log4j</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.jboss.logging</groupId>
-            <artifactId>jboss-logging</artifactId>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <scope>compile</scope>
         </dependency>
 
         <dependency>