keycloak-aplcache

Changes

Details

diff --git a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
index aa55d71..b17e523 100755
--- a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
+++ b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
@@ -11,510 +11,510 @@ import java.util.Set;
  * @version $Revision: 1 $
  */
 public class RealmRepresentation {
-	protected String id;
-	protected String realm;
-	protected Integer notBefore;
-	protected Integer accessTokenLifespan;
-	protected Integer ssoSessionIdleTimeout;
-	protected Integer ssoSessionMaxLifespan;
-	protected Integer accessCodeLifespan;
-	protected Integer accessCodeLifespanUserAction;
-	protected Integer accessCodeLifespanLogin;
-	protected Boolean enabled;
-	protected String sslRequired;
-	protected Boolean passwordCredentialGrantAllowed;
-	protected Boolean registrationAllowed;
-	protected Boolean registrationEmailAsUsername;
-	protected Boolean rememberMe;
-	protected Boolean verifyEmail;
-	protected Boolean resetPasswordAllowed;
-
-	protected Boolean userCacheEnabled;
-	protected Boolean realmCacheEnabled;
-
-	// --- brute force settings
-	protected Boolean bruteForceProtected;
-	protected Integer maxFailureWaitSeconds;
-	protected Integer minimumQuickLoginWaitSeconds;
-	protected Integer waitIncrementSeconds;
-	protected Long quickLoginCheckMilliSeconds;
-	protected Integer maxDeltaTimeSeconds;
-	protected Integer failureFactor;
-	// --- end brute force settings
-
-	protected String privateKey;
-	protected String publicKey;
-	protected String certificate;
-	protected String codeSecret;
-	protected RolesRepresentation roles;
-	protected List<String> defaultRoles;
-	protected Set<String> requiredCredentials;
-	protected String passwordPolicy;
-	protected List<UserRepresentation> users;
-	protected List<ScopeMappingRepresentation> scopeMappings;
-	protected Map<String, List<ScopeMappingRepresentation>> applicationScopeMappings;
-	protected List<ApplicationRepresentation> applications;
-	protected List<OAuthClientRepresentation> oauthClients;
-	protected Map<String, String> browserSecurityHeaders;
-	protected Map<String, String> smtpServer;
-	protected List<UserFederationProviderRepresentation> userFederationProviders;
-	protected String loginTheme;
-	protected String accountTheme;
-	protected String adminTheme;
-	protected String emailTheme;
-	protected Boolean eventsEnabled;
-	protected Long eventsExpiration;
-	protected List<String> eventsListeners;
-	private List<IdentityProviderRepresentation> identityProviders;
-	private List<ProtocolMapperRepresentation> protocolMappers;
-	private Boolean identityFederationEnabled;
-
-	public String getId() {
-		return id;
-	}
-
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	public String getRealm() {
-		return realm;
-	}
-
-	public void setRealm(String realm) {
-		this.realm = realm;
-	}
-
-	public List<UserRepresentation> getUsers() {
-		return users;
-	}
-
-	public List<ApplicationRepresentation> getApplications() {
-		return applications;
-	}
-
-	public ApplicationRepresentation resource(String name) {
-		ApplicationRepresentation resource = new ApplicationRepresentation();
-		if (applications == null)
-			applications = new ArrayList<ApplicationRepresentation>();
-		applications.add(resource);
-		resource.setName(name);
-		return resource;
-	}
-
-	public void setUsers(List<UserRepresentation> users) {
-		this.users = users;
-	}
-
-	public UserRepresentation user(String username) {
-		UserRepresentation user = new UserRepresentation();
-		user.setUsername(username);
-		if (users == null)
-			users = new ArrayList<UserRepresentation>();
-		users.add(user);
-		return user;
-	}
-
-	public void setApplications(List<ApplicationRepresentation> applications) {
-		this.applications = applications;
-	}
-
-	public Boolean isEnabled() {
-		return enabled;
-	}
-
-	public void setEnabled(Boolean enabled) {
-		this.enabled = enabled;
-	}
-
-	public String getSslRequired() {
-		return sslRequired;
-	}
-
-	public void setSslRequired(String sslRequired) {
-		this.sslRequired = sslRequired;
-	}
-
-	public Integer getAccessTokenLifespan() {
-		return accessTokenLifespan;
-	}
-
-	public void setAccessTokenLifespan(Integer accessTokenLifespan) {
-		this.accessTokenLifespan = accessTokenLifespan;
-	}
-
-	public Integer getSsoSessionIdleTimeout() {
-		return ssoSessionIdleTimeout;
-	}
-
-	public void setSsoSessionIdleTimeout(Integer ssoSessionIdleTimeout) {
-		this.ssoSessionIdleTimeout = ssoSessionIdleTimeout;
-	}
-
-	public Integer getSsoSessionMaxLifespan() {
-		return ssoSessionMaxLifespan;
-	}
-
-	public void setSsoSessionMaxLifespan(Integer ssoSessionMaxLifespan) {
-		this.ssoSessionMaxLifespan = ssoSessionMaxLifespan;
-	}
-
-	public List<ScopeMappingRepresentation> getScopeMappings() {
-		return scopeMappings;
-	}
-
-	public ScopeMappingRepresentation scopeMapping(String username) {
-		ScopeMappingRepresentation mapping = new ScopeMappingRepresentation();
-		mapping.setClient(username);
-		if (scopeMappings == null)
-			scopeMappings = new ArrayList<ScopeMappingRepresentation>();
-		scopeMappings.add(mapping);
-		return mapping;
-	}
-
-	public Set<String> getRequiredCredentials() {
-		return requiredCredentials;
-	}
-
-	public void setRequiredCredentials(Set<String> requiredCredentials) {
-		this.requiredCredentials = requiredCredentials;
-	}
-
-	public String getPasswordPolicy() {
-		return passwordPolicy;
-	}
-
-	public void setPasswordPolicy(String passwordPolicy) {
-		this.passwordPolicy = passwordPolicy;
-	}
-
-	public Integer getAccessCodeLifespan() {
-		return accessCodeLifespan;
-	}
-
-	public void setAccessCodeLifespan(Integer accessCodeLifespan) {
-		this.accessCodeLifespan = accessCodeLifespan;
-	}
-
-	public Integer getAccessCodeLifespanUserAction() {
-		return accessCodeLifespanUserAction;
-	}
-
-	public void setAccessCodeLifespanUserAction(Integer accessCodeLifespanUserAction) {
-		this.accessCodeLifespanUserAction = accessCodeLifespanUserAction;
-	}
-
-	public Integer getAccessCodeLifespanLogin() {
-		return accessCodeLifespanLogin;
-	}
-
-	public void setAccessCodeLifespanLogin(Integer accessCodeLifespanLogin) {
-		this.accessCodeLifespanLogin = accessCodeLifespanLogin;
-	}
-
-	public List<String> getDefaultRoles() {
-		return defaultRoles;
-	}
-
-	public void setDefaultRoles(List<String> defaultRoles) {
-		this.defaultRoles = defaultRoles;
-	}
-
-	public String getPrivateKey() {
-		return privateKey;
-	}
-
-	public void setPrivateKey(String privateKey) {
-		this.privateKey = privateKey;
-	}
-
-	public String getPublicKey() {
-		return publicKey;
-	}
-
-	public void setPublicKey(String publicKey) {
-		this.publicKey = publicKey;
-	}
-
-	public String getCertificate() {
-		return certificate;
-	}
-
-	public void setCertificate(String certificate) {
-		this.certificate = certificate;
-	}
-
-	public String getCodeSecret() {
-		return codeSecret;
-	}
-
-	public void setCodeSecret(String codeSecret) {
-		this.codeSecret = codeSecret;
-	}
-
-	public Boolean isPasswordCredentialGrantAllowed() {
-		return passwordCredentialGrantAllowed;
-	}
-
-	public void setPasswordCredentialGrantAllowed(Boolean passwordCredentialGrantAllowed) {
-		this.passwordCredentialGrantAllowed = passwordCredentialGrantAllowed;
-	}
-
-	public Boolean isRegistrationAllowed() {
-		return registrationAllowed;
-	}
-
-	public void setRegistrationAllowed(Boolean registrationAllowed) {
-		this.registrationAllowed = registrationAllowed;
-	}
+    protected String id;
+    protected String realm;
+    protected Integer notBefore;
+    protected Integer accessTokenLifespan;
+    protected Integer ssoSessionIdleTimeout;
+    protected Integer ssoSessionMaxLifespan;
+    protected Integer accessCodeLifespan;
+    protected Integer accessCodeLifespanUserAction;
+    protected Integer accessCodeLifespanLogin;
+    protected Boolean enabled;
+    protected String sslRequired;
+    protected Boolean passwordCredentialGrantAllowed;
+    protected Boolean registrationAllowed;
+    protected Boolean registrationEmailAsUsername;
+    protected Boolean rememberMe;
+    protected Boolean verifyEmail;
+    protected Boolean resetPasswordAllowed;
+
+    protected Boolean userCacheEnabled;
+    protected Boolean realmCacheEnabled;
+
+    // --- brute force settings
+    protected Boolean bruteForceProtected;
+    protected Integer maxFailureWaitSeconds;
+    protected Integer minimumQuickLoginWaitSeconds;
+    protected Integer waitIncrementSeconds;
+    protected Long quickLoginCheckMilliSeconds;
+    protected Integer maxDeltaTimeSeconds;
+    protected Integer failureFactor;
+    // --- end brute force settings
+
+    protected String privateKey;
+    protected String publicKey;
+    protected String certificate;
+    protected String codeSecret;
+    protected RolesRepresentation roles;
+    protected List<String> defaultRoles;
+    protected Set<String> requiredCredentials;
+    protected String passwordPolicy;
+    protected List<UserRepresentation> users;
+    protected List<ScopeMappingRepresentation> scopeMappings;
+    protected Map<String, List<ScopeMappingRepresentation>> applicationScopeMappings;
+    protected List<ApplicationRepresentation> applications;
+    protected List<OAuthClientRepresentation> oauthClients;
+    protected Map<String, String> browserSecurityHeaders;
+    protected Map<String, String> smtpServer;
+    protected List<UserFederationProviderRepresentation> userFederationProviders;
+    protected String loginTheme;
+    protected String accountTheme;
+    protected String adminTheme;
+    protected String emailTheme;
+    protected Boolean eventsEnabled;
+    protected Long eventsExpiration;
+    protected List<String> eventsListeners;
+    private List<IdentityProviderRepresentation> identityProviders;
+    private List<ProtocolMapperRepresentation> protocolMappers;
+    private Boolean identityFederationEnabled;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getRealm() {
+        return realm;
+    }
+
+    public void setRealm(String realm) {
+        this.realm = realm;
+    }
+
+    public List<UserRepresentation> getUsers() {
+        return users;
+    }
+
+    public List<ApplicationRepresentation> getApplications() {
+        return applications;
+    }
+
+    public ApplicationRepresentation resource(String name) {
+        ApplicationRepresentation resource = new ApplicationRepresentation();
+        if (applications == null)
+            applications = new ArrayList<ApplicationRepresentation>();
+        applications.add(resource);
+        resource.setName(name);
+        return resource;
+    }
+
+    public void setUsers(List<UserRepresentation> users) {
+        this.users = users;
+    }
+
+    public UserRepresentation user(String username) {
+        UserRepresentation user = new UserRepresentation();
+        user.setUsername(username);
+        if (users == null)
+            users = new ArrayList<UserRepresentation>();
+        users.add(user);
+        return user;
+    }
+
+    public void setApplications(List<ApplicationRepresentation> applications) {
+        this.applications = applications;
+    }
+
+    public Boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getSslRequired() {
+        return sslRequired;
+    }
+
+    public void setSslRequired(String sslRequired) {
+        this.sslRequired = sslRequired;
+    }
+
+    public Integer getAccessTokenLifespan() {
+        return accessTokenLifespan;
+    }
+
+    public void setAccessTokenLifespan(Integer accessTokenLifespan) {
+        this.accessTokenLifespan = accessTokenLifespan;
+    }
+
+    public Integer getSsoSessionIdleTimeout() {
+        return ssoSessionIdleTimeout;
+    }
+
+    public void setSsoSessionIdleTimeout(Integer ssoSessionIdleTimeout) {
+        this.ssoSessionIdleTimeout = ssoSessionIdleTimeout;
+    }
+
+    public Integer getSsoSessionMaxLifespan() {
+        return ssoSessionMaxLifespan;
+    }
+
+    public void setSsoSessionMaxLifespan(Integer ssoSessionMaxLifespan) {
+        this.ssoSessionMaxLifespan = ssoSessionMaxLifespan;
+    }
+
+    public List<ScopeMappingRepresentation> getScopeMappings() {
+        return scopeMappings;
+    }
+
+    public ScopeMappingRepresentation scopeMapping(String username) {
+        ScopeMappingRepresentation mapping = new ScopeMappingRepresentation();
+        mapping.setClient(username);
+        if (scopeMappings == null)
+            scopeMappings = new ArrayList<ScopeMappingRepresentation>();
+        scopeMappings.add(mapping);
+        return mapping;
+    }
+
+    public Set<String> getRequiredCredentials() {
+        return requiredCredentials;
+    }
+
+    public void setRequiredCredentials(Set<String> requiredCredentials) {
+        this.requiredCredentials = requiredCredentials;
+    }
+
+    public String getPasswordPolicy() {
+        return passwordPolicy;
+    }
+
+    public void setPasswordPolicy(String passwordPolicy) {
+        this.passwordPolicy = passwordPolicy;
+    }
+
+    public Integer getAccessCodeLifespan() {
+        return accessCodeLifespan;
+    }
+
+    public void setAccessCodeLifespan(Integer accessCodeLifespan) {
+        this.accessCodeLifespan = accessCodeLifespan;
+    }
+
+    public Integer getAccessCodeLifespanUserAction() {
+        return accessCodeLifespanUserAction;
+    }
+
+    public void setAccessCodeLifespanUserAction(Integer accessCodeLifespanUserAction) {
+        this.accessCodeLifespanUserAction = accessCodeLifespanUserAction;
+    }
+
+    public Integer getAccessCodeLifespanLogin() {
+        return accessCodeLifespanLogin;
+    }
+
+    public void setAccessCodeLifespanLogin(Integer accessCodeLifespanLogin) {
+        this.accessCodeLifespanLogin = accessCodeLifespanLogin;
+    }
+
+    public List<String> getDefaultRoles() {
+        return defaultRoles;
+    }
+
+    public void setDefaultRoles(List<String> defaultRoles) {
+        this.defaultRoles = defaultRoles;
+    }
+
+    public String getPrivateKey() {
+        return privateKey;
+    }
+
+    public void setPrivateKey(String privateKey) {
+        this.privateKey = privateKey;
+    }
+
+    public String getPublicKey() {
+        return publicKey;
+    }
+
+    public void setPublicKey(String publicKey) {
+        this.publicKey = publicKey;
+    }
+
+    public String getCertificate() {
+        return certificate;
+    }
+
+    public void setCertificate(String certificate) {
+        this.certificate = certificate;
+    }
+
+    public String getCodeSecret() {
+        return codeSecret;
+    }
+
+    public void setCodeSecret(String codeSecret) {
+        this.codeSecret = codeSecret;
+    }
+
+    public Boolean isPasswordCredentialGrantAllowed() {
+        return passwordCredentialGrantAllowed;
+    }
+
+    public void setPasswordCredentialGrantAllowed(Boolean passwordCredentialGrantAllowed) {
+        this.passwordCredentialGrantAllowed = passwordCredentialGrantAllowed;
+    }
+
+    public Boolean isRegistrationAllowed() {
+        return registrationAllowed;
+    }
+
+    public void setRegistrationAllowed(Boolean registrationAllowed) {
+        this.registrationAllowed = registrationAllowed;
+    }
 
-	public Boolean isRegistrationEmailAsUsername() {
-		return registrationEmailAsUsername;
-	}
+    public Boolean isRegistrationEmailAsUsername() {
+        return registrationEmailAsUsername;
+    }
 
-	public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
-		this.registrationEmailAsUsername = registrationEmailAsUsername;
-	}
+    public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
+        this.registrationEmailAsUsername = registrationEmailAsUsername;
+    }
 
-	public Boolean isRememberMe() {
-		return rememberMe;
-	}
+    public Boolean isRememberMe() {
+        return rememberMe;
+    }
 
-	public void setRememberMe(Boolean rememberMe) {
-		this.rememberMe = rememberMe;
-	}
+    public void setRememberMe(Boolean rememberMe) {
+        this.rememberMe = rememberMe;
+    }
 
-	public Boolean isRealmCacheEnabled() {
-		return realmCacheEnabled;
-	}
+    public Boolean isRealmCacheEnabled() {
+        return realmCacheEnabled;
+    }
 
-	public void setRealmCacheEnabled(Boolean realmCacheEnabled) {
-		this.realmCacheEnabled = realmCacheEnabled;
-	}
+    public void setRealmCacheEnabled(Boolean realmCacheEnabled) {
+        this.realmCacheEnabled = realmCacheEnabled;
+    }
 
-	public Boolean isUserCacheEnabled() {
-		return userCacheEnabled;
-	}
+    public Boolean isUserCacheEnabled() {
+        return userCacheEnabled;
+    }
 
-	public void setUserCacheEnabled(Boolean userCacheEnabled) {
-		this.userCacheEnabled = userCacheEnabled;
-	}
+    public void setUserCacheEnabled(Boolean userCacheEnabled) {
+        this.userCacheEnabled = userCacheEnabled;
+    }
 
-	public Boolean isVerifyEmail() {
-		return verifyEmail;
-	}
+    public Boolean isVerifyEmail() {
+        return verifyEmail;
+    }
 
-	public void setVerifyEmail(Boolean verifyEmail) {
-		this.verifyEmail = verifyEmail;
-	}
+    public void setVerifyEmail(Boolean verifyEmail) {
+        this.verifyEmail = verifyEmail;
+    }
 
-	public Boolean isResetPasswordAllowed() {
-		return resetPasswordAllowed;
-	}
+    public Boolean isResetPasswordAllowed() {
+        return resetPasswordAllowed;
+    }
 
-	public void setResetPasswordAllowed(Boolean resetPassword) {
-		this.resetPasswordAllowed = resetPassword;
-	}
+    public void setResetPasswordAllowed(Boolean resetPassword) {
+        this.resetPasswordAllowed = resetPassword;
+    }
 
-	public Map<String, String> getBrowserSecurityHeaders() {
-		return browserSecurityHeaders;
-	}
+    public Map<String, String> getBrowserSecurityHeaders() {
+        return browserSecurityHeaders;
+    }
 
-	public void setBrowserSecurityHeaders(Map<String, String> browserSecurityHeaders) {
-		this.browserSecurityHeaders = browserSecurityHeaders;
-	}
+    public void setBrowserSecurityHeaders(Map<String, String> browserSecurityHeaders) {
+        this.browserSecurityHeaders = browserSecurityHeaders;
+    }
 
-	public Map<String, String> getSmtpServer() {
-		return smtpServer;
-	}
+    public Map<String, String> getSmtpServer() {
+        return smtpServer;
+    }
 
-	public void setSmtpServer(Map<String, String> smtpServer) {
-		this.smtpServer = smtpServer;
-	}
+    public void setSmtpServer(Map<String, String> smtpServer) {
+        this.smtpServer = smtpServer;
+    }
 
-	public List<OAuthClientRepresentation> getOauthClients() {
-		return oauthClients;
-	}
+    public List<OAuthClientRepresentation> getOauthClients() {
+        return oauthClients;
+    }
 
-	public void setOauthClients(List<OAuthClientRepresentation> oauthClients) {
-		this.oauthClients = oauthClients;
-	}
+    public void setOauthClients(List<OAuthClientRepresentation> oauthClients) {
+        this.oauthClients = oauthClients;
+    }
 
-	public Map<String, List<ScopeMappingRepresentation>> getApplicationScopeMappings() {
-		return applicationScopeMappings;
-	}
+    public Map<String, List<ScopeMappingRepresentation>> getApplicationScopeMappings() {
+        return applicationScopeMappings;
+    }
 
-	public void setApplicationScopeMappings(Map<String, List<ScopeMappingRepresentation>> applicationScopeMappings) {
-		this.applicationScopeMappings = applicationScopeMappings;
-	}
+    public void setApplicationScopeMappings(Map<String, List<ScopeMappingRepresentation>> applicationScopeMappings) {
+        this.applicationScopeMappings = applicationScopeMappings;
+    }
 
-	public RolesRepresentation getRoles() {
-		return roles;
-	}
+    public RolesRepresentation getRoles() {
+        return roles;
+    }
 
-	public void setRoles(RolesRepresentation roles) {
-		this.roles = roles;
-	}
+    public void setRoles(RolesRepresentation roles) {
+        this.roles = roles;
+    }
 
-	public String getLoginTheme() {
-		return loginTheme;
-	}
+    public String getLoginTheme() {
+        return loginTheme;
+    }
 
-	public void setLoginTheme(String loginTheme) {
-		this.loginTheme = loginTheme;
-	}
+    public void setLoginTheme(String loginTheme) {
+        this.loginTheme = loginTheme;
+    }
 
-	public String getAccountTheme() {
-		return accountTheme;
-	}
+    public String getAccountTheme() {
+        return accountTheme;
+    }
 
-	public void setAccountTheme(String accountTheme) {
-		this.accountTheme = accountTheme;
-	}
+    public void setAccountTheme(String accountTheme) {
+        this.accountTheme = accountTheme;
+    }
 
-	public String getAdminTheme() {
-		return adminTheme;
-	}
+    public String getAdminTheme() {
+        return adminTheme;
+    }
 
-	public void setAdminTheme(String adminTheme) {
-		this.adminTheme = adminTheme;
-	}
+    public void setAdminTheme(String adminTheme) {
+        this.adminTheme = adminTheme;
+    }
 
-	public String getEmailTheme() {
-		return emailTheme;
-	}
+    public String getEmailTheme() {
+        return emailTheme;
+    }
 
-	public void setEmailTheme(String emailTheme) {
-		this.emailTheme = emailTheme;
-	}
+    public void setEmailTheme(String emailTheme) {
+        this.emailTheme = emailTheme;
+    }
 
-	public Integer getNotBefore() {
-		return notBefore;
-	}
+    public Integer getNotBefore() {
+        return notBefore;
+    }
 
-	public void setNotBefore(Integer notBefore) {
-		this.notBefore = notBefore;
-	}
+    public void setNotBefore(Integer notBefore) {
+        this.notBefore = notBefore;
+    }
 
-	public Boolean isBruteForceProtected() {
-		return bruteForceProtected;
-	}
+    public Boolean isBruteForceProtected() {
+        return bruteForceProtected;
+    }
 
-	public void setBruteForceProtected(Boolean bruteForceProtected) {
-		this.bruteForceProtected = bruteForceProtected;
-	}
+    public void setBruteForceProtected(Boolean bruteForceProtected) {
+        this.bruteForceProtected = bruteForceProtected;
+    }
 
-	public Integer getMaxFailureWaitSeconds() {
-		return maxFailureWaitSeconds;
-	}
+    public Integer getMaxFailureWaitSeconds() {
+        return maxFailureWaitSeconds;
+    }
 
-	public void setMaxFailureWaitSeconds(Integer maxFailureWaitSeconds) {
-		this.maxFailureWaitSeconds = maxFailureWaitSeconds;
-	}
+    public void setMaxFailureWaitSeconds(Integer maxFailureWaitSeconds) {
+        this.maxFailureWaitSeconds = maxFailureWaitSeconds;
+    }
 
-	public Integer getMinimumQuickLoginWaitSeconds() {
-		return minimumQuickLoginWaitSeconds;
-	}
+    public Integer getMinimumQuickLoginWaitSeconds() {
+        return minimumQuickLoginWaitSeconds;
+    }
 
-	public void setMinimumQuickLoginWaitSeconds(Integer minimumQuickLoginWaitSeconds) {
-		this.minimumQuickLoginWaitSeconds = minimumQuickLoginWaitSeconds;
-	}
+    public void setMinimumQuickLoginWaitSeconds(Integer minimumQuickLoginWaitSeconds) {
+        this.minimumQuickLoginWaitSeconds = minimumQuickLoginWaitSeconds;
+    }
 
-	public Integer getWaitIncrementSeconds() {
-		return waitIncrementSeconds;
-	}
+    public Integer getWaitIncrementSeconds() {
+        return waitIncrementSeconds;
+    }
 
-	public void setWaitIncrementSeconds(Integer waitIncrementSeconds) {
-		this.waitIncrementSeconds = waitIncrementSeconds;
-	}
+    public void setWaitIncrementSeconds(Integer waitIncrementSeconds) {
+        this.waitIncrementSeconds = waitIncrementSeconds;
+    }
 
-	public Long getQuickLoginCheckMilliSeconds() {
-		return quickLoginCheckMilliSeconds;
-	}
+    public Long getQuickLoginCheckMilliSeconds() {
+        return quickLoginCheckMilliSeconds;
+    }
 
-	public void setQuickLoginCheckMilliSeconds(Long quickLoginCheckMilliSeconds) {
-		this.quickLoginCheckMilliSeconds = quickLoginCheckMilliSeconds;
-	}
+    public void setQuickLoginCheckMilliSeconds(Long quickLoginCheckMilliSeconds) {
+        this.quickLoginCheckMilliSeconds = quickLoginCheckMilliSeconds;
+    }
 
-	public Integer getMaxDeltaTimeSeconds() {
-		return maxDeltaTimeSeconds;
-	}
+    public Integer getMaxDeltaTimeSeconds() {
+        return maxDeltaTimeSeconds;
+    }
 
-	public void setMaxDeltaTimeSeconds(Integer maxDeltaTimeSeconds) {
-		this.maxDeltaTimeSeconds = maxDeltaTimeSeconds;
-	}
+    public void setMaxDeltaTimeSeconds(Integer maxDeltaTimeSeconds) {
+        this.maxDeltaTimeSeconds = maxDeltaTimeSeconds;
+    }
 
-	public Integer getFailureFactor() {
-		return failureFactor;
-	}
+    public Integer getFailureFactor() {
+        return failureFactor;
+    }
 
-	public void setFailureFactor(Integer failureFactor) {
-		this.failureFactor = failureFactor;
-	}
+    public void setFailureFactor(Integer failureFactor) {
+        this.failureFactor = failureFactor;
+    }
 
-	public Boolean isEventsEnabled() {
-		return eventsEnabled;
-	}
+    public Boolean isEventsEnabled() {
+        return eventsEnabled;
+    }
 
-	public void setEventsEnabled(boolean eventsEnabled) {
-		this.eventsEnabled = eventsEnabled;
-	}
+    public void setEventsEnabled(boolean eventsEnabled) {
+        this.eventsEnabled = eventsEnabled;
+    }
 
-	public Long getEventsExpiration() {
-		return eventsExpiration;
-	}
+    public Long getEventsExpiration() {
+        return eventsExpiration;
+    }
 
-	public void setEventsExpiration(long eventsExpiration) {
-		this.eventsExpiration = eventsExpiration;
-	}
+    public void setEventsExpiration(long eventsExpiration) {
+        this.eventsExpiration = eventsExpiration;
+    }
 
-	public List<String> getEventsListeners() {
-		return eventsListeners;
-	}
+    public List<String> getEventsListeners() {
+        return eventsListeners;
+    }
 
-	public void setEventsListeners(List<String> eventsListeners) {
-		this.eventsListeners = eventsListeners;
-	}
+    public void setEventsListeners(List<String> eventsListeners) {
+        this.eventsListeners = eventsListeners;
+    }
 
-	public List<UserFederationProviderRepresentation> getUserFederationProviders() {
-		return userFederationProviders;
-	}
+    public List<UserFederationProviderRepresentation> getUserFederationProviders() {
+        return userFederationProviders;
+    }
 
-	public void setUserFederationProviders(List<UserFederationProviderRepresentation> userFederationProviders) {
-		this.userFederationProviders = userFederationProviders;
-	}
+    public void setUserFederationProviders(List<UserFederationProviderRepresentation> userFederationProviders) {
+        this.userFederationProviders = userFederationProviders;
+    }
 
-	public List<IdentityProviderRepresentation> getIdentityProviders() {
-		if (this.identityProviders == null) {
-			this.identityProviders = new ArrayList<IdentityProviderRepresentation>();
-		}
-
-		return identityProviders;
-	}
+    public List<IdentityProviderRepresentation> getIdentityProviders() {
+        if (this.identityProviders == null) {
+            this.identityProviders = new ArrayList<IdentityProviderRepresentation>();
+        }
+
+        return identityProviders;
+    }
 
-	public void setIdentityProviders(List<IdentityProviderRepresentation> identityProviders) {
-		this.identityProviders = identityProviders;
-	}
+    public void setIdentityProviders(List<IdentityProviderRepresentation> identityProviders) {
+        this.identityProviders = identityProviders;
+    }
 
-	public void addIdentityProvider(IdentityProviderRepresentation identityProviderRepresentation) {
-		getIdentityProviders().add(identityProviderRepresentation);
-	}
+    public void addIdentityProvider(IdentityProviderRepresentation identityProviderRepresentation) {
+        getIdentityProviders().add(identityProviderRepresentation);
+    }
 
-	public boolean isIdentityFederationEnabled() {
-		return !getIdentityProviders().isEmpty();
-	}
+    public boolean isIdentityFederationEnabled() {
+        return !getIdentityProviders().isEmpty();
+    }
 
-	public List<ProtocolMapperRepresentation> getProtocolMappers() {
-		return protocolMappers;
-	}
+    public List<ProtocolMapperRepresentation> getProtocolMappers() {
+        return protocolMappers;
+    }
 
-	public void addProtocolMapper(ProtocolMapperRepresentation rep) {
-		if (protocolMappers == null)
-			protocolMappers = new LinkedList<ProtocolMapperRepresentation>();
-		protocolMappers.add(rep);
-	}
-
-	public void setProtocolMappers(List<ProtocolMapperRepresentation> protocolMappers) {
-		this.protocolMappers = protocolMappers;
-	}
+    public void addProtocolMapper(ProtocolMapperRepresentation rep) {
+        if (protocolMappers == null)
+            protocolMappers = new LinkedList<ProtocolMapperRepresentation>();
+        protocolMappers.add(rep);
+    }
+
+    public void setProtocolMappers(List<ProtocolMapperRepresentation> protocolMappers) {
+        this.protocolMappers = protocolMappers;
+    }
 }
diff --git a/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/model/RealmBean.java b/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/model/RealmBean.java
index 499474d..e4ac27f 100755
--- a/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/model/RealmBean.java
+++ b/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/model/RealmBean.java
@@ -30,43 +30,43 @@ import org.keycloak.representations.idm.CredentialRepresentation;
  */
 public class RealmBean {
 
-	private RealmModel realm;
+    private RealmModel realm;
 
-	public RealmBean(RealmModel realmModel) {
-		realm = realmModel;
-	}
+    public RealmBean(RealmModel realmModel) {
+        realm = realmModel;
+    }
 
-	public String getName() {
-		return realm.getName();
-	}
+    public String getName() {
+        return realm.getName();
+    }
 
-	public boolean isIdentityFederationEnabled() {
-		return realm.isIdentityFederationEnabled();
-	}
+    public boolean isIdentityFederationEnabled() {
+        return realm.isIdentityFederationEnabled();
+    }
 
-	public boolean isRegistrationAllowed() {
-		return realm.isRegistrationAllowed();
-	}
+    public boolean isRegistrationAllowed() {
+        return realm.isRegistrationAllowed();
+    }
 
-	public boolean isRegistrationEmailAsUsername() {
-		return realm.isRegistrationEmailAsUsername();
-	}
+    public boolean isRegistrationEmailAsUsername() {
+        return realm.isRegistrationEmailAsUsername();
+    }
 
-	public boolean isResetPasswordAllowed() {
-		return realm.isResetPasswordAllowed();
-	}
+    public boolean isResetPasswordAllowed() {
+        return realm.isResetPasswordAllowed();
+    }
 
-	public boolean isRememberMe() {
-		return realm.isRememberMe();
-	}
+    public boolean isRememberMe() {
+        return realm.isRememberMe();
+    }
 
-	public boolean isPassword() {
-		for (RequiredCredentialModel r : realm.getRequiredCredentials()) {
-			if (r.getType().equals(CredentialRepresentation.PASSWORD)) {
-				return true;
-			}
-		}
-		return false;
-	}
+    public boolean isPassword() {
+        for (RequiredCredentialModel r : realm.getRequiredCredentials()) {
+            if (r.getType().equals(CredentialRepresentation.PASSWORD)) {
+                return true;
+            }
+        }
+        return false;
+    }
 
 }
diff --git a/model/api/src/main/java/org/keycloak/models/entities/RealmEntity.java b/model/api/src/main/java/org/keycloak/models/entities/RealmEntity.java
index 203c0b9..9538e66 100755
--- a/model/api/src/main/java/org/keycloak/models/entities/RealmEntity.java
+++ b/model/api/src/main/java/org/keycloak/models/entities/RealmEntity.java
@@ -10,402 +10,402 @@ import java.util.Map;
  */
 public class RealmEntity extends AbstractIdentifiableEntity {
 
-	private String name;
-	private boolean enabled;
-	private String sslRequired;
-	private boolean registrationAllowed;
-	protected boolean registrationEmailAsUsername;
-	private boolean rememberMe;
-	private boolean verifyEmail;
-	private boolean passwordCredentialGrantAllowed;
-	private boolean resetPasswordAllowed;
-	private String passwordPolicy;
-	// --- brute force settings
-	private boolean bruteForceProtected;
-	private int maxFailureWaitSeconds;
-	private int minimumQuickLoginWaitSeconds;
-	private int waitIncrementSeconds;
-	private long quickLoginCheckMilliSeconds;
-	private int maxDeltaTimeSeconds;
-	private int failureFactor;
-	// --- end brute force settings
-
-	private int ssoSessionIdleTimeout;
-	private int ssoSessionMaxLifespan;
-	private int accessTokenLifespan;
-	private int accessCodeLifespan;
-	private int accessCodeLifespanUserAction;
-	private int accessCodeLifespanLogin;
-	private int notBefore;
-
-	private String publicKeyPem;
-	private String privateKeyPem;
-	private String certificatePem;
-	private String codeSecret;
-
-	private String loginTheme;
-	private String accountTheme;
-	private String adminTheme;
-	private String emailTheme;
-
-	// We are using names of defaultRoles (not ids)
-	private List<String> defaultRoles = new ArrayList<String>();
-
-	private List<RequiredCredentialEntity> requiredCredentials = new ArrayList<RequiredCredentialEntity>();
-	private List<UserFederationProviderEntity> userFederationProviders = new ArrayList<UserFederationProviderEntity>();
-	private List<IdentityProviderEntity> identityProviders = new ArrayList<IdentityProviderEntity>();
-
-	private Map<String, String> browserSecurityHeaders = new HashMap<String, String>();
-	private Map<String, String> smtpConfig = new HashMap<String, String>();
-	private Map<String, String> socialConfig = new HashMap<String, String>();
-
-	private boolean eventsEnabled;
-	private long eventsExpiration;
-	private List<String> eventsListeners = new ArrayList<String>();
-
-	private String adminAppId;
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-
-	public String getSslRequired() {
-		return sslRequired;
-	}
-
-	public void setSslRequired(String sslRequired) {
-		this.sslRequired = sslRequired;
-	}
-
-	public boolean isPasswordCredentialGrantAllowed() {
-		return passwordCredentialGrantAllowed;
-	}
-
-	public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
-		this.passwordCredentialGrantAllowed = passwordCredentialGrantAllowed;
-	}
-
-	public boolean isRegistrationAllowed() {
-		return registrationAllowed;
-	}
-
-	public void setRegistrationAllowed(boolean registrationAllowed) {
-		this.registrationAllowed = registrationAllowed;
-	}
-
-	public boolean isRegistrationEmailAsUsername() {
-		return registrationEmailAsUsername;
-	}
-
-	public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
-		this.registrationEmailAsUsername = registrationEmailAsUsername;
-	}
-
-	public boolean isRememberMe() {
-		return rememberMe;
-	}
-
-	public void setRememberMe(boolean rememberMe) {
-		this.rememberMe = rememberMe;
-	}
-
-	public boolean isVerifyEmail() {
-		return verifyEmail;
-	}
-
-	public void setVerifyEmail(boolean verifyEmail) {
-		this.verifyEmail = verifyEmail;
-	}
+    private String name;
+    private boolean enabled;
+    private String sslRequired;
+    private boolean registrationAllowed;
+    protected boolean registrationEmailAsUsername;
+    private boolean rememberMe;
+    private boolean verifyEmail;
+    private boolean passwordCredentialGrantAllowed;
+    private boolean resetPasswordAllowed;
+    private String passwordPolicy;
+    // --- brute force settings
+    private boolean bruteForceProtected;
+    private int maxFailureWaitSeconds;
+    private int minimumQuickLoginWaitSeconds;
+    private int waitIncrementSeconds;
+    private long quickLoginCheckMilliSeconds;
+    private int maxDeltaTimeSeconds;
+    private int failureFactor;
+    // --- end brute force settings
+
+    private int ssoSessionIdleTimeout;
+    private int ssoSessionMaxLifespan;
+    private int accessTokenLifespan;
+    private int accessCodeLifespan;
+    private int accessCodeLifespanUserAction;
+    private int accessCodeLifespanLogin;
+    private int notBefore;
+
+    private String publicKeyPem;
+    private String privateKeyPem;
+    private String certificatePem;
+    private String codeSecret;
+
+    private String loginTheme;
+    private String accountTheme;
+    private String adminTheme;
+    private String emailTheme;
+
+    // We are using names of defaultRoles (not ids)
+    private List<String> defaultRoles = new ArrayList<String>();
+
+    private List<RequiredCredentialEntity> requiredCredentials = new ArrayList<RequiredCredentialEntity>();
+    private List<UserFederationProviderEntity> userFederationProviders = new ArrayList<UserFederationProviderEntity>();
+    private List<IdentityProviderEntity> identityProviders = new ArrayList<IdentityProviderEntity>();
+
+    private Map<String, String> browserSecurityHeaders = new HashMap<String, String>();
+    private Map<String, String> smtpConfig = new HashMap<String, String>();
+    private Map<String, String> socialConfig = new HashMap<String, String>();
+
+    private boolean eventsEnabled;
+    private long eventsExpiration;
+    private List<String> eventsListeners = new ArrayList<String>();
+
+    private String adminAppId;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getSslRequired() {
+        return sslRequired;
+    }
+
+    public void setSslRequired(String sslRequired) {
+        this.sslRequired = sslRequired;
+    }
+
+    public boolean isPasswordCredentialGrantAllowed() {
+        return passwordCredentialGrantAllowed;
+    }
+
+    public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
+        this.passwordCredentialGrantAllowed = passwordCredentialGrantAllowed;
+    }
+
+    public boolean isRegistrationAllowed() {
+        return registrationAllowed;
+    }
+
+    public void setRegistrationAllowed(boolean registrationAllowed) {
+        this.registrationAllowed = registrationAllowed;
+    }
+
+    public boolean isRegistrationEmailAsUsername() {
+        return registrationEmailAsUsername;
+    }
+
+    public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
+        this.registrationEmailAsUsername = registrationEmailAsUsername;
+    }
+
+    public boolean isRememberMe() {
+        return rememberMe;
+    }
+
+    public void setRememberMe(boolean rememberMe) {
+        this.rememberMe = rememberMe;
+    }
+
+    public boolean isVerifyEmail() {
+        return verifyEmail;
+    }
+
+    public void setVerifyEmail(boolean verifyEmail) {
+        this.verifyEmail = verifyEmail;
+    }
 
-	public boolean isResetPasswordAllowed() {
-		return resetPasswordAllowed;
-	}
+    public boolean isResetPasswordAllowed() {
+        return resetPasswordAllowed;
+    }
 
-	public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
-		this.resetPasswordAllowed = resetPasswordAllowed;
-	}
+    public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
+        this.resetPasswordAllowed = resetPasswordAllowed;
+    }
 
-	public String getPasswordPolicy() {
-		return passwordPolicy;
-	}
+    public String getPasswordPolicy() {
+        return passwordPolicy;
+    }
 
-	public void setPasswordPolicy(String passwordPolicy) {
-		this.passwordPolicy = passwordPolicy;
-	}
+    public void setPasswordPolicy(String passwordPolicy) {
+        this.passwordPolicy = passwordPolicy;
+    }
 
-	public boolean isBruteForceProtected() {
-		return bruteForceProtected;
-	}
+    public boolean isBruteForceProtected() {
+        return bruteForceProtected;
+    }
 
-	public void setBruteForceProtected(boolean bruteForceProtected) {
-		this.bruteForceProtected = bruteForceProtected;
-	}
+    public void setBruteForceProtected(boolean bruteForceProtected) {
+        this.bruteForceProtected = bruteForceProtected;
+    }
 
-	public int getMaxFailureWaitSeconds() {
-		return maxFailureWaitSeconds;
-	}
+    public int getMaxFailureWaitSeconds() {
+        return maxFailureWaitSeconds;
+    }
 
-	public void setMaxFailureWaitSeconds(int maxFailureWaitSeconds) {
-		this.maxFailureWaitSeconds = maxFailureWaitSeconds;
-	}
+    public void setMaxFailureWaitSeconds(int maxFailureWaitSeconds) {
+        this.maxFailureWaitSeconds = maxFailureWaitSeconds;
+    }
 
-	public int getMinimumQuickLoginWaitSeconds() {
-		return minimumQuickLoginWaitSeconds;
-	}
+    public int getMinimumQuickLoginWaitSeconds() {
+        return minimumQuickLoginWaitSeconds;
+    }
 
-	public void setMinimumQuickLoginWaitSeconds(int minimumQuickLoginWaitSeconds) {
-		this.minimumQuickLoginWaitSeconds = minimumQuickLoginWaitSeconds;
-	}
+    public void setMinimumQuickLoginWaitSeconds(int minimumQuickLoginWaitSeconds) {
+        this.minimumQuickLoginWaitSeconds = minimumQuickLoginWaitSeconds;
+    }
 
-	public int getWaitIncrementSeconds() {
-		return waitIncrementSeconds;
-	}
+    public int getWaitIncrementSeconds() {
+        return waitIncrementSeconds;
+    }
 
-	public void setWaitIncrementSeconds(int waitIncrementSeconds) {
-		this.waitIncrementSeconds = waitIncrementSeconds;
-	}
+    public void setWaitIncrementSeconds(int waitIncrementSeconds) {
+        this.waitIncrementSeconds = waitIncrementSeconds;
+    }
 
-	public long getQuickLoginCheckMilliSeconds() {
-		return quickLoginCheckMilliSeconds;
-	}
+    public long getQuickLoginCheckMilliSeconds() {
+        return quickLoginCheckMilliSeconds;
+    }
 
-	public void setQuickLoginCheckMilliSeconds(long quickLoginCheckMilliSeconds) {
-		this.quickLoginCheckMilliSeconds = quickLoginCheckMilliSeconds;
-	}
+    public void setQuickLoginCheckMilliSeconds(long quickLoginCheckMilliSeconds) {
+        this.quickLoginCheckMilliSeconds = quickLoginCheckMilliSeconds;
+    }
 
-	public int getMaxDeltaTimeSeconds() {
-		return maxDeltaTimeSeconds;
-	}
+    public int getMaxDeltaTimeSeconds() {
+        return maxDeltaTimeSeconds;
+    }
 
-	public void setMaxDeltaTimeSeconds(int maxDeltaTimeSeconds) {
-		this.maxDeltaTimeSeconds = maxDeltaTimeSeconds;
-	}
+    public void setMaxDeltaTimeSeconds(int maxDeltaTimeSeconds) {
+        this.maxDeltaTimeSeconds = maxDeltaTimeSeconds;
+    }
 
-	public int getFailureFactor() {
-		return failureFactor;
-	}
+    public int getFailureFactor() {
+        return failureFactor;
+    }
 
-	public void setFailureFactor(int failureFactor) {
-		this.failureFactor = failureFactor;
-	}
+    public void setFailureFactor(int failureFactor) {
+        this.failureFactor = failureFactor;
+    }
 
-	public int getSsoSessionIdleTimeout() {
-		return ssoSessionIdleTimeout;
-	}
+    public int getSsoSessionIdleTimeout() {
+        return ssoSessionIdleTimeout;
+    }
 
-	public void setSsoSessionIdleTimeout(int ssoSessionIdleTimeout) {
-		this.ssoSessionIdleTimeout = ssoSessionIdleTimeout;
-	}
+    public void setSsoSessionIdleTimeout(int ssoSessionIdleTimeout) {
+        this.ssoSessionIdleTimeout = ssoSessionIdleTimeout;
+    }
 
-	public int getSsoSessionMaxLifespan() {
-		return ssoSessionMaxLifespan;
-	}
+    public int getSsoSessionMaxLifespan() {
+        return ssoSessionMaxLifespan;
+    }
 
-	public void setSsoSessionMaxLifespan(int ssoSessionMaxLifespan) {
-		this.ssoSessionMaxLifespan = ssoSessionMaxLifespan;
-	}
+    public void setSsoSessionMaxLifespan(int ssoSessionMaxLifespan) {
+        this.ssoSessionMaxLifespan = ssoSessionMaxLifespan;
+    }
 
-	public int getAccessTokenLifespan() {
-		return accessTokenLifespan;
-	}
+    public int getAccessTokenLifespan() {
+        return accessTokenLifespan;
+    }
 
-	public void setAccessTokenLifespan(int accessTokenLifespan) {
-		this.accessTokenLifespan = accessTokenLifespan;
-	}
+    public void setAccessTokenLifespan(int accessTokenLifespan) {
+        this.accessTokenLifespan = accessTokenLifespan;
+    }
 
-	public int getAccessCodeLifespan() {
-		return accessCodeLifespan;
-	}
+    public int getAccessCodeLifespan() {
+        return accessCodeLifespan;
+    }
 
-	public void setAccessCodeLifespan(int accessCodeLifespan) {
-		this.accessCodeLifespan = accessCodeLifespan;
-	}
+    public void setAccessCodeLifespan(int accessCodeLifespan) {
+        this.accessCodeLifespan = accessCodeLifespan;
+    }
 
-	public int getAccessCodeLifespanUserAction() {
-		return accessCodeLifespanUserAction;
-	}
+    public int getAccessCodeLifespanUserAction() {
+        return accessCodeLifespanUserAction;
+    }
 
-	public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
-		this.accessCodeLifespanUserAction = accessCodeLifespanUserAction;
-	}
+    public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
+        this.accessCodeLifespanUserAction = accessCodeLifespanUserAction;
+    }
 
-	public int getAccessCodeLifespanLogin() {
-		return accessCodeLifespanLogin;
-	}
+    public int getAccessCodeLifespanLogin() {
+        return accessCodeLifespanLogin;
+    }
 
-	public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
-		this.accessCodeLifespanLogin = accessCodeLifespanLogin;
-	}
+    public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
+        this.accessCodeLifespanLogin = accessCodeLifespanLogin;
+    }
 
-	public int getNotBefore() {
-		return notBefore;
-	}
+    public int getNotBefore() {
+        return notBefore;
+    }
 
-	public void setNotBefore(int notBefore) {
-		this.notBefore = notBefore;
-	}
+    public void setNotBefore(int notBefore) {
+        this.notBefore = notBefore;
+    }
 
-	public String getPublicKeyPem() {
-		return publicKeyPem;
-	}
+    public String getPublicKeyPem() {
+        return publicKeyPem;
+    }
 
-	public void setPublicKeyPem(String publicKeyPem) {
-		this.publicKeyPem = publicKeyPem;
-	}
+    public void setPublicKeyPem(String publicKeyPem) {
+        this.publicKeyPem = publicKeyPem;
+    }
 
-	public String getPrivateKeyPem() {
-		return privateKeyPem;
-	}
+    public String getPrivateKeyPem() {
+        return privateKeyPem;
+    }
 
-	public void setPrivateKeyPem(String privateKeyPem) {
-		this.privateKeyPem = privateKeyPem;
-	}
+    public void setPrivateKeyPem(String privateKeyPem) {
+        this.privateKeyPem = privateKeyPem;
+    }
 
-	public String getCodeSecret() {
-		return codeSecret;
-	}
+    public String getCodeSecret() {
+        return codeSecret;
+    }
 
-	public void setCodeSecret(String codeSecret) {
-		this.codeSecret = codeSecret;
-	}
+    public void setCodeSecret(String codeSecret) {
+        this.codeSecret = codeSecret;
+    }
 
-	public String getLoginTheme() {
-		return loginTheme;
-	}
+    public String getLoginTheme() {
+        return loginTheme;
+    }
 
-	public void setLoginTheme(String loginTheme) {
-		this.loginTheme = loginTheme;
-	}
+    public void setLoginTheme(String loginTheme) {
+        this.loginTheme = loginTheme;
+    }
 
-	public String getAccountTheme() {
-		return accountTheme;
-	}
+    public String getAccountTheme() {
+        return accountTheme;
+    }
 
-	public void setAccountTheme(String accountTheme) {
-		this.accountTheme = accountTheme;
-	}
+    public void setAccountTheme(String accountTheme) {
+        this.accountTheme = accountTheme;
+    }
 
-	public String getAdminTheme() {
-		return adminTheme;
-	}
+    public String getAdminTheme() {
+        return adminTheme;
+    }
 
-	public void setAdminTheme(String adminTheme) {
-		this.adminTheme = adminTheme;
-	}
+    public void setAdminTheme(String adminTheme) {
+        this.adminTheme = adminTheme;
+    }
 
-	public String getEmailTheme() {
-		return emailTheme;
-	}
+    public String getEmailTheme() {
+        return emailTheme;
+    }
 
-	public void setEmailTheme(String emailTheme) {
-		this.emailTheme = emailTheme;
-	}
+    public void setEmailTheme(String emailTheme) {
+        this.emailTheme = emailTheme;
+    }
 
-	public List<String> getDefaultRoles() {
-		return defaultRoles;
-	}
+    public List<String> getDefaultRoles() {
+        return defaultRoles;
+    }
 
-	public void setDefaultRoles(List<String> defaultRoles) {
-		this.defaultRoles = defaultRoles;
-	}
+    public void setDefaultRoles(List<String> defaultRoles) {
+        this.defaultRoles = defaultRoles;
+    }
 
-	public List<RequiredCredentialEntity> getRequiredCredentials() {
-		return requiredCredentials;
-	}
+    public List<RequiredCredentialEntity> getRequiredCredentials() {
+        return requiredCredentials;
+    }
 
-	public void setRequiredCredentials(List<RequiredCredentialEntity> requiredCredentials) {
-		this.requiredCredentials = requiredCredentials;
-	}
+    public void setRequiredCredentials(List<RequiredCredentialEntity> requiredCredentials) {
+        this.requiredCredentials = requiredCredentials;
+    }
 
-	public Map<String, String> getBrowserSecurityHeaders() {
-		return browserSecurityHeaders;
-	}
+    public Map<String, String> getBrowserSecurityHeaders() {
+        return browserSecurityHeaders;
+    }
 
-	public void setBrowserSecurityHeaders(Map<String, String> browserSecurityHeaders) {
-		this.browserSecurityHeaders = browserSecurityHeaders;
-	}
+    public void setBrowserSecurityHeaders(Map<String, String> browserSecurityHeaders) {
+        this.browserSecurityHeaders = browserSecurityHeaders;
+    }
 
-	public Map<String, String> getSmtpConfig() {
-		return smtpConfig;
-	}
+    public Map<String, String> getSmtpConfig() {
+        return smtpConfig;
+    }
 
-	public void setSmtpConfig(Map<String, String> smtpConfig) {
-		this.smtpConfig = smtpConfig;
-	}
+    public void setSmtpConfig(Map<String, String> smtpConfig) {
+        this.smtpConfig = smtpConfig;
+    }
 
-	public Map<String, String> getSocialConfig() {
-		return socialConfig;
-	}
+    public Map<String, String> getSocialConfig() {
+        return socialConfig;
+    }
 
-	public void setSocialConfig(Map<String, String> socialConfig) {
-		this.socialConfig = socialConfig;
-	}
+    public void setSocialConfig(Map<String, String> socialConfig) {
+        this.socialConfig = socialConfig;
+    }
 
-	public boolean isEventsEnabled() {
-		return eventsEnabled;
-	}
+    public boolean isEventsEnabled() {
+        return eventsEnabled;
+    }
 
-	public void setEventsEnabled(boolean eventsEnabled) {
-		this.eventsEnabled = eventsEnabled;
-	}
+    public void setEventsEnabled(boolean eventsEnabled) {
+        this.eventsEnabled = eventsEnabled;
+    }
 
-	public long getEventsExpiration() {
-		return eventsExpiration;
-	}
+    public long getEventsExpiration() {
+        return eventsExpiration;
+    }
 
-	public void setEventsExpiration(long eventsExpiration) {
-		this.eventsExpiration = eventsExpiration;
-	}
+    public void setEventsExpiration(long eventsExpiration) {
+        this.eventsExpiration = eventsExpiration;
+    }
 
-	public List<String> getEventsListeners() {
-		return eventsListeners;
-	}
+    public List<String> getEventsListeners() {
+        return eventsListeners;
+    }
 
-	public void setEventsListeners(List<String> eventsListeners) {
-		this.eventsListeners = eventsListeners;
-	}
+    public void setEventsListeners(List<String> eventsListeners) {
+        this.eventsListeners = eventsListeners;
+    }
 
-	public String getAdminAppId() {
-		return adminAppId;
-	}
+    public String getAdminAppId() {
+        return adminAppId;
+    }
 
-	public void setAdminAppId(String adminAppId) {
-		this.adminAppId = adminAppId;
-	}
+    public void setAdminAppId(String adminAppId) {
+        this.adminAppId = adminAppId;
+    }
 
-	public List<UserFederationProviderEntity> getUserFederationProviders() {
-		return userFederationProviders;
-	}
+    public List<UserFederationProviderEntity> getUserFederationProviders() {
+        return userFederationProviders;
+    }
 
-	public void setUserFederationProviders(List<UserFederationProviderEntity> userFederationProviders) {
-		this.userFederationProviders = userFederationProviders;
-	}
+    public void setUserFederationProviders(List<UserFederationProviderEntity> userFederationProviders) {
+        this.userFederationProviders = userFederationProviders;
+    }
 
-	public List<IdentityProviderEntity> getIdentityProviders() {
-		return identityProviders;
-	}
+    public List<IdentityProviderEntity> getIdentityProviders() {
+        return identityProviders;
+    }
 
-	public void setIdentityProviders(List<IdentityProviderEntity> identityProviders) {
-		this.identityProviders = identityProviders;
-	}
+    public void setIdentityProviders(List<IdentityProviderEntity> identityProviders) {
+        this.identityProviders = identityProviders;
+    }
 
-	public String getCertificatePem() {
-		return certificatePem;
-	}
+    public String getCertificatePem() {
+        return certificatePem;
+    }
 
-	public void setCertificatePem(String certificatePem) {
-		this.certificatePem = certificatePem;
-	}
+    public void setCertificatePem(String certificatePem) {
+        this.certificatePem = certificatePem;
+    }
 }
diff --git a/model/api/src/main/java/org/keycloak/models/RealmModel.java b/model/api/src/main/java/org/keycloak/models/RealmModel.java
index b1781bd..fe363db 100755
--- a/model/api/src/main/java/org/keycloak/models/RealmModel.java
+++ b/model/api/src/main/java/org/keycloak/models/RealmModel.java
@@ -16,264 +16,240 @@ import org.keycloak.provider.ProviderEvent;
  * @version $Revision: 1 $
  */
 public interface RealmModel extends RoleContainerModel {
-	interface RealmCreationEvent extends ProviderEvent {
-		RealmModel getCreatedRealm();
-	}
+    interface RealmCreationEvent extends ProviderEvent {
+        RealmModel getCreatedRealm();
+    }
+    interface ClientCreationEvent extends ProviderEvent {
+        ClientModel getCreatedClient();
+    }
+    interface ApplicationCreationEvent extends ClientCreationEvent {
+        ApplicationModel getCreatedApplication();
+    }
+    interface OAuthClientCreationEvent extends ClientCreationEvent {
+        OAuthClientModel getCreatedOAuthClient();
+    }
 
-	interface ClientCreationEvent extends ProviderEvent {
-		ClientModel getCreatedClient();
-	}
+    String getId();
 
-	interface ApplicationCreationEvent extends ClientCreationEvent {
-		ApplicationModel getCreatedApplication();
-	}
+    String getName();
 
-	interface OAuthClientCreationEvent extends ClientCreationEvent {
-		OAuthClientModel getCreatedOAuthClient();
-	}
+    void setName(String name);
 
-	String getId();
+    boolean isEnabled();
 
-	String getName();
+    void setEnabled(boolean enabled);
 
-	void setName(String name);
+    SslRequired getSslRequired();
 
-	boolean isEnabled();
+    void setSslRequired(SslRequired sslRequired);
 
-	void setEnabled(boolean enabled);
+    boolean isRegistrationAllowed();
 
-	SslRequired getSslRequired();
+    void setRegistrationAllowed(boolean registrationAllowed);
 
-	void setSslRequired(SslRequired sslRequired);
+    public boolean isRegistrationEmailAsUsername();
 
-	boolean isRegistrationAllowed();
+    public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername);
 
-	void setRegistrationAllowed(boolean registrationAllowed);
+    boolean isPasswordCredentialGrantAllowed();
 
-	public boolean isRegistrationEmailAsUsername();
+    void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed);
 
-	public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername);
+    boolean isRememberMe();
 
-	boolean isPasswordCredentialGrantAllowed();
+    void setRememberMe(boolean rememberMe);
 
-	void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed);
+    //--- brute force settings
+    boolean isBruteForceProtected();
+    void setBruteForceProtected(boolean value);
+    int getMaxFailureWaitSeconds();
+    void setMaxFailureWaitSeconds(int val);
+    int getWaitIncrementSeconds();
+    void setWaitIncrementSeconds(int val);
+    int getMinimumQuickLoginWaitSeconds();
+    void setMinimumQuickLoginWaitSeconds(int val);
+    long getQuickLoginCheckMilliSeconds();
+    void setQuickLoginCheckMilliSeconds(long val);
+    int getMaxDeltaTimeSeconds();
+    void setMaxDeltaTimeSeconds(int val);
+    int getFailureFactor();
+    void setFailureFactor(int failureFactor);
+    //--- end brute force settings
 
-	boolean isRememberMe();
 
-	void setRememberMe(boolean rememberMe);
+    boolean isVerifyEmail();
 
-	// --- brute force settings
-	boolean isBruteForceProtected();
+    void setVerifyEmail(boolean verifyEmail);
 
-	void setBruteForceProtected(boolean value);
+    boolean isResetPasswordAllowed();
 
-	int getMaxFailureWaitSeconds();
+    void setResetPasswordAllowed(boolean resetPasswordAllowed);
 
-	void setMaxFailureWaitSeconds(int val);
+    int getSsoSessionIdleTimeout();
+    void setSsoSessionIdleTimeout(int seconds);
 
-	int getWaitIncrementSeconds();
+    int getSsoSessionMaxLifespan();
+    void setSsoSessionMaxLifespan(int seconds);
 
-	void setWaitIncrementSeconds(int val);
+    int getAccessTokenLifespan();
 
-	int getMinimumQuickLoginWaitSeconds();
+    void setAccessTokenLifespan(int seconds);
 
-	void setMinimumQuickLoginWaitSeconds(int val);
+    int getAccessCodeLifespan();
 
-	long getQuickLoginCheckMilliSeconds();
+    void setAccessCodeLifespan(int seconds);
 
-	void setQuickLoginCheckMilliSeconds(long val);
+    int getAccessCodeLifespanUserAction();
 
-	int getMaxDeltaTimeSeconds();
+    void setAccessCodeLifespanUserAction(int seconds);
 
-	void setMaxDeltaTimeSeconds(int val);
+    int getAccessCodeLifespanLogin();
 
-	int getFailureFactor();
+    void setAccessCodeLifespanLogin(int seconds);
 
-	void setFailureFactor(int failureFactor);
+    String getPublicKeyPem();
 
-	// --- end brute force settings
+    void setPublicKeyPem(String publicKeyPem);
 
-	boolean isVerifyEmail();
+    String getPrivateKeyPem();
 
-	void setVerifyEmail(boolean verifyEmail);
+    void setPrivateKeyPem(String privateKeyPem);
 
-	boolean isResetPasswordAllowed();
+    PublicKey getPublicKey();
 
-	void setResetPasswordAllowed(boolean resetPasswordAllowed);
+    void setPublicKey(PublicKey publicKey);
 
-	int getSsoSessionIdleTimeout();
+    String getCodeSecret();
 
-	void setSsoSessionIdleTimeout(int seconds);
+    Key getCodeSecretKey();
 
-	int getSsoSessionMaxLifespan();
+    void setCodeSecret(String codeSecret);
 
-	void setSsoSessionMaxLifespan(int seconds);
+    X509Certificate getCertificate();
+    void setCertificate(X509Certificate certificate);
+    String getCertificatePem();
+    void setCertificatePem(String certificate);
 
-	int getAccessTokenLifespan();
+    PrivateKey getPrivateKey();
 
-	void setAccessTokenLifespan(int seconds);
+    void setPrivateKey(PrivateKey privateKey);
 
-	int getAccessCodeLifespan();
+    List<RequiredCredentialModel> getRequiredCredentials();
 
-	void setAccessCodeLifespan(int seconds);
+    void addRequiredCredential(String cred);
 
-	int getAccessCodeLifespanUserAction();
+    PasswordPolicy getPasswordPolicy();
 
-	void setAccessCodeLifespanUserAction(int seconds);
+    void setPasswordPolicy(PasswordPolicy policy);
 
-	int getAccessCodeLifespanLogin();
+    RoleModel getRoleById(String id);
 
-	void setAccessCodeLifespanLogin(int seconds);
+    List<String> getDefaultRoles();
 
-	String getPublicKeyPem();
+    void addDefaultRole(String name);
 
-	void setPublicKeyPem(String publicKeyPem);
+    void updateDefaultRoles(String[] defaultRoles);
 
-	String getPrivateKeyPem();
+    ClientModel findClient(String clientId);
 
-	void setPrivateKeyPem(String privateKeyPem);
+    Map<String, ApplicationModel> getApplicationNameMap();
 
-	PublicKey getPublicKey();
+    List<ApplicationModel> getApplications();
 
-	void setPublicKey(PublicKey publicKey);
+    ApplicationModel addApplication(String name);
 
-	String getCodeSecret();
+    ApplicationModel addApplication(String id, String name);
 
-	Key getCodeSecretKey();
+    boolean removeApplication(String id);
 
-	void setCodeSecret(String codeSecret);
+    ApplicationModel getApplicationById(String id);
+    ApplicationModel getApplicationByName(String name);
 
-	X509Certificate getCertificate();
+    void updateRequiredCredentials(Set<String> creds);
 
-	void setCertificate(X509Certificate certificate);
+    OAuthClientModel addOAuthClient(String name);
 
-	String getCertificatePem();
+    OAuthClientModel addOAuthClient(String id, String name);
 
-	void setCertificatePem(String certificate);
+    OAuthClientModel getOAuthClient(String name);
+    OAuthClientModel getOAuthClientById(String id);
+    boolean removeOAuthClient(String id);
 
-	PrivateKey getPrivateKey();
+    List<OAuthClientModel> getOAuthClients();
 
-	void setPrivateKey(PrivateKey privateKey);
+    Map<String, String> getBrowserSecurityHeaders();
 
-	List<RequiredCredentialModel> getRequiredCredentials();
+    void setBrowserSecurityHeaders(Map<String, String> headers);
 
-	void addRequiredCredential(String cred);
+    Map<String, String> getSmtpConfig();
 
-	PasswordPolicy getPasswordPolicy();
+    void setSmtpConfig(Map<String, String> smtpConfig);
 
-	void setPasswordPolicy(PasswordPolicy policy);
+    List<IdentityProviderModel> getIdentityProviders();
 
-	RoleModel getRoleById(String id);
+    IdentityProviderModel getIdentityProviderById(String identityProviderId);
 
-	List<String> getDefaultRoles();
+    void addIdentityProvider(IdentityProviderModel identityProvider);
 
-	void addDefaultRole(String name);
+    void removeIdentityProviderById(String providerId);
 
-	void updateDefaultRoles(String[] defaultRoles);
+    void updateIdentityProvider(IdentityProviderModel identityProvider);
 
-	ClientModel findClient(String clientId);
+    List<UserFederationProviderModel> getUserFederationProviders();
 
-	Map<String, ApplicationModel> getApplicationNameMap();
+    UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config, int priority,
+            String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync);
 
-	List<ApplicationModel> getApplications();
+    void updateUserFederationProvider(UserFederationProviderModel provider);
 
-	ApplicationModel addApplication(String name);
+    void removeUserFederationProvider(UserFederationProviderModel provider);
 
-	ApplicationModel addApplication(String id, String name);
+    void setUserFederationProviders(List<UserFederationProviderModel> providers);
 
-	boolean removeApplication(String id);
+    String getLoginTheme();
 
-	ApplicationModel getApplicationById(String id);
+    void setLoginTheme(String name);
 
-	ApplicationModel getApplicationByName(String name);
+    String getAccountTheme();
 
-	void updateRequiredCredentials(Set<String> creds);
+    void setAccountTheme(String name);
 
-	OAuthClientModel addOAuthClient(String name);
+    String getAdminTheme();
 
-	OAuthClientModel addOAuthClient(String id, String name);
+    void setAdminTheme(String name);
 
-	OAuthClientModel getOAuthClient(String name);
+    String getEmailTheme();
 
-	OAuthClientModel getOAuthClientById(String id);
+    void setEmailTheme(String name);
 
-	boolean removeOAuthClient(String id);
+    /**
+     * Time in seconds since epoc
+     * 
+     * @return
+     */
+    int getNotBefore();
 
-	List<OAuthClientModel> getOAuthClients();
+    void setNotBefore(int notBefore);
 
-	Map<String, String> getBrowserSecurityHeaders();
+    boolean removeRoleById(String id);
 
-	void setBrowserSecurityHeaders(Map<String, String> headers);
+    boolean isEventsEnabled();
 
-	Map<String, String> getSmtpConfig();
+    void setEventsEnabled(boolean enabled);
 
-	void setSmtpConfig(Map<String, String> smtpConfig);
+    long getEventsExpiration();
 
-	List<IdentityProviderModel> getIdentityProviders();
+    void setEventsExpiration(long expiration);
 
-	IdentityProviderModel getIdentityProviderById(String identityProviderId);
+    Set<String> getEventsListeners();
 
-	void addIdentityProvider(IdentityProviderModel identityProvider);
+    void setEventsListeners(Set<String> listeners);
 
-	void removeIdentityProviderById(String providerId);
+    ApplicationModel getMasterAdminApp();
 
-	void updateIdentityProvider(IdentityProviderModel identityProvider);
+    void setMasterAdminApp(ApplicationModel app);
 
-	List<UserFederationProviderModel> getUserFederationProviders();
+    ClientModel findClientById(String id);
 
-	UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config, int priority,
-			String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync);
-
-	void updateUserFederationProvider(UserFederationProviderModel provider);
-
-	void removeUserFederationProvider(UserFederationProviderModel provider);
-
-	void setUserFederationProviders(List<UserFederationProviderModel> providers);
-
-	String getLoginTheme();
-
-	void setLoginTheme(String name);
-
-	String getAccountTheme();
-
-	void setAccountTheme(String name);
-
-	String getAdminTheme();
-
-	void setAdminTheme(String name);
-
-	String getEmailTheme();
-
-	void setEmailTheme(String name);
-
-	/**
-	 * Time in seconds since epoc
-	 * 
-	 * @return
-	 */
-	int getNotBefore();
-
-	void setNotBefore(int notBefore);
-
-	boolean removeRoleById(String id);
-
-	boolean isEventsEnabled();
-
-	void setEventsEnabled(boolean enabled);
-
-	long getEventsExpiration();
-
-	void setEventsExpiration(long expiration);
-
-	Set<String> getEventsListeners();
-
-	void setEventsListeners(Set<String> listeners);
-
-	ApplicationModel getMasterAdminApp();
-
-	void setMasterAdminApp(ApplicationModel app);
-
-	ClientModel findClientById(String id);
-
-	boolean isIdentityFederationEnabled();
+    boolean isIdentityFederationEnabled();
 }
diff --git a/model/api/src/main/java/org/keycloak/models/utils/ModelToRepresentation.java b/model/api/src/main/java/org/keycloak/models/utils/ModelToRepresentation.java
index 834475e..e7cdbc3 100755
--- a/model/api/src/main/java/org/keycloak/models/utils/ModelToRepresentation.java
+++ b/model/api/src/main/java/org/keycloak/models/utils/ModelToRepresentation.java
@@ -44,326 +44,326 @@ import org.keycloak.representations.idm.UserSessionRepresentation;
  * @version $Revision: 1 $
  */
 public class ModelToRepresentation {
-	public static UserRepresentation toRepresentation(UserModel user) {
-		UserRepresentation rep = new UserRepresentation();
-		rep.setId(user.getId());
-		rep.setUsername(user.getUsername());
-		rep.setLastName(user.getLastName());
-		rep.setFirstName(user.getFirstName());
-		rep.setEmail(user.getEmail());
-		rep.setEnabled(user.isEnabled());
-		rep.setEmailVerified(user.isEmailVerified());
-		rep.setTotp(user.isTotp());
-		rep.setFederationLink(user.getFederationLink());
-
-		List<String> reqActions = new ArrayList<String>();
-		for (UserModel.RequiredAction ra : user.getRequiredActions()) {
-			reqActions.add(ra.name());
-		}
-
-		rep.setRequiredActions(reqActions);
-
-		if (user.getAttributes() != null && !user.getAttributes().isEmpty()) {
-			Map<String, String> attrs = new HashMap<String, String>();
-			attrs.putAll(user.getAttributes());
-			rep.setAttributes(attrs);
-		}
-		return rep;
-	}
-
-	public static RoleRepresentation toRepresentation(RoleModel role) {
-		RoleRepresentation rep = new RoleRepresentation();
-		rep.setId(role.getId());
-		rep.setName(role.getName());
-		rep.setDescription(role.getDescription());
-		rep.setComposite(role.isComposite());
-		return rep;
-	}
-
-	public static RealmRepresentation toRepresentation(RealmModel realm, boolean internal) {
-		RealmRepresentation rep = new RealmRepresentation();
-		rep.setId(realm.getId());
-		rep.setRealm(realm.getName());
-		rep.setEnabled(realm.isEnabled());
-		rep.setNotBefore(realm.getNotBefore());
-		rep.setSslRequired(realm.getSslRequired().name().toLowerCase());
-		rep.setPublicKey(realm.getPublicKeyPem());
-		if (internal) {
-			rep.setPrivateKey(realm.getPrivateKeyPem());
-			String privateKeyPem = realm.getPrivateKeyPem();
-			if (realm.getCertificatePem() == null && privateKeyPem != null) {
-				KeycloakModelUtils.generateRealmCertificate(realm);
-			}
-			rep.setCodeSecret(realm.getCodeSecret());
-		}
-		rep.setCertificate(realm.getCertificatePem());
-		rep.setPasswordCredentialGrantAllowed(realm.isPasswordCredentialGrantAllowed());
-		rep.setRegistrationAllowed(realm.isRegistrationAllowed());
-		rep.setRegistrationEmailAsUsername(realm.isRegistrationEmailAsUsername());
-		rep.setRememberMe(realm.isRememberMe());
-		rep.setBruteForceProtected(realm.isBruteForceProtected());
-		rep.setMaxFailureWaitSeconds(realm.getMaxFailureWaitSeconds());
-		rep.setMinimumQuickLoginWaitSeconds(realm.getMinimumQuickLoginWaitSeconds());
-		rep.setWaitIncrementSeconds(realm.getWaitIncrementSeconds());
-		rep.setQuickLoginCheckMilliSeconds(realm.getQuickLoginCheckMilliSeconds());
-		rep.setMaxDeltaTimeSeconds(realm.getMaxDeltaTimeSeconds());
-		rep.setFailureFactor(realm.getFailureFactor());
-		rep.setVerifyEmail(realm.isVerifyEmail());
-		rep.setResetPasswordAllowed(realm.isResetPasswordAllowed());
-		rep.setAccessTokenLifespan(realm.getAccessTokenLifespan());
-		rep.setSsoSessionIdleTimeout(realm.getSsoSessionIdleTimeout());
-		rep.setSsoSessionMaxLifespan(realm.getSsoSessionMaxLifespan());
-		rep.setAccessCodeLifespan(realm.getAccessCodeLifespan());
-		rep.setAccessCodeLifespanUserAction(realm.getAccessCodeLifespanUserAction());
-		rep.setAccessCodeLifespanLogin(realm.getAccessCodeLifespanLogin());
-		rep.setSmtpServer(realm.getSmtpConfig());
-		rep.setBrowserSecurityHeaders(realm.getBrowserSecurityHeaders());
-		rep.setAccountTheme(realm.getAccountTheme());
-		rep.setLoginTheme(realm.getLoginTheme());
-		rep.setAdminTheme(realm.getAdminTheme());
-		rep.setEmailTheme(realm.getEmailTheme());
-		if (realm.getPasswordPolicy() != null) {
-			rep.setPasswordPolicy(realm.getPasswordPolicy().toString());
-		}
-
-		List<String> defaultRoles = realm.getDefaultRoles();
-		if (!defaultRoles.isEmpty()) {
-			List<String> roleStrings = new ArrayList<String>();
-			roleStrings.addAll(defaultRoles);
-			rep.setDefaultRoles(roleStrings);
-		}
-
-		List<RequiredCredentialModel> requiredCredentialModels = realm.getRequiredCredentials();
-		if (requiredCredentialModels.size() > 0) {
-			rep.setRequiredCredentials(new HashSet<String>());
-			for (RequiredCredentialModel cred : requiredCredentialModels) {
-				rep.getRequiredCredentials().add(cred.getType());
-			}
-		}
-
-		List<UserFederationProviderModel> fedProviderModels = realm.getUserFederationProviders();
-		if (fedProviderModels.size() > 0) {
-			List<UserFederationProviderRepresentation> fedProviderReps = new ArrayList<UserFederationProviderRepresentation>();
-			for (UserFederationProviderModel model : fedProviderModels) {
-				UserFederationProviderRepresentation fedProvRep = toRepresentation(model);
-				fedProviderReps.add(fedProvRep);
-			}
-			rep.setUserFederationProviders(fedProviderReps);
-		}
-
-		for (IdentityProviderModel provider : realm.getIdentityProviders()) {
-			rep.addIdentityProvider(toRepresentation(provider));
-		}
-
-		return rep;
-	}
-
-	public static RealmEventsConfigRepresentation toEventsConfigReprensetation(RealmModel realm) {
-		RealmEventsConfigRepresentation rep = new RealmEventsConfigRepresentation();
-		rep.setEventsEnabled(realm.isEventsEnabled());
-
-		if (realm.getEventsExpiration() != 0) {
-			rep.setEventsExpiration(realm.getEventsExpiration());
-		}
-
-		if (realm.getEventsListeners() != null) {
-			rep.setEventsListeners(new LinkedList<String>(realm.getEventsListeners()));
-		}
-		return rep;
-	}
-
-	public static CredentialRepresentation toRepresentation(UserCredentialModel cred) {
-		CredentialRepresentation rep = new CredentialRepresentation();
-		rep.setType(CredentialRepresentation.SECRET);
-		rep.setValue(cred.getValue());
-		return rep;
-	}
-
-	public static ClaimRepresentation toRepresentation(ClientModel model) {
-		ClaimRepresentation rep = new ClaimRepresentation();
-		rep.setAddress(ClaimMask.hasAddress(model.getAllowedClaimsMask()));
-		rep.setEmail(ClaimMask.hasEmail(model.getAllowedClaimsMask()));
-		rep.setGender(ClaimMask.hasGender(model.getAllowedClaimsMask()));
-		rep.setLocale(ClaimMask.hasLocale(model.getAllowedClaimsMask()));
-		rep.setName(ClaimMask.hasName(model.getAllowedClaimsMask()));
-		rep.setPhone(ClaimMask.hasPhone(model.getAllowedClaimsMask()));
-		rep.setPicture(ClaimMask.hasPicture(model.getAllowedClaimsMask()));
-		rep.setProfile(ClaimMask.hasProfile(model.getAllowedClaimsMask()));
-		rep.setWebsite(ClaimMask.hasWebsite(model.getAllowedClaimsMask()));
-		rep.setUsername(ClaimMask.hasUsername(model.getAllowedClaimsMask()));
-		return rep;
-	}
-
-	public static FederatedIdentityRepresentation toRepresentation(FederatedIdentityModel socialLink) {
-		FederatedIdentityRepresentation rep = new FederatedIdentityRepresentation();
-		rep.setUserName(socialLink.getUserName());
-		rep.setIdentityProvider(socialLink.getIdentityProvider());
-		rep.setUserId(socialLink.getUserId());
-		return rep;
-	}
-
-	public static UserSessionRepresentation toRepresentation(UserSessionModel session) {
-		UserSessionRepresentation rep = new UserSessionRepresentation();
-		rep.setId(session.getId());
-		rep.setStart(((long) session.getStarted()) * 1000L);
-		rep.setLastAccess(((long) session.getLastSessionRefresh()) * 1000L);
-		rep.setUser(session.getUser().getUsername());
-		rep.setIpAddress(session.getIpAddress());
-		for (ClientSessionModel clientSession : session.getClientSessions()) {
-			ClientModel client = clientSession.getClient();
-			if (client instanceof ApplicationModel) {
-				rep.getApplications().put(client.getId(), client.getClientId());
-			} else if (client instanceof OAuthClientModel) {
-				rep.getClients().put(client.getId(), client.getClientId());
-			}
-		}
-		return rep;
-	}
-
-	public static ApplicationRepresentation toRepresentation(ApplicationModel applicationModel) {
-		ApplicationRepresentation rep = new ApplicationRepresentation();
-		rep.setId(applicationModel.getId());
-		rep.setName(applicationModel.getName());
-		rep.setEnabled(applicationModel.isEnabled());
-		rep.setAdminUrl(applicationModel.getManagementUrl());
-		rep.setPublicClient(applicationModel.isPublicClient());
-		rep.setFrontchannelLogout(applicationModel.isFrontchannelLogout());
-		rep.setProtocol(applicationModel.getProtocol());
-		rep.setAttributes(applicationModel.getAttributes());
-		rep.setFullScopeAllowed(applicationModel.isFullScopeAllowed());
-		rep.setBearerOnly(applicationModel.isBearerOnly());
-		rep.setSurrogateAuthRequired(applicationModel.isSurrogateAuthRequired());
-		rep.setBaseUrl(applicationModel.getBaseUrl());
-		rep.setNotBefore(applicationModel.getNotBefore());
-		rep.setNodeReRegistrationTimeout(applicationModel.getNodeReRegistrationTimeout());
-
-		Set<String> redirectUris = applicationModel.getRedirectUris();
-		if (redirectUris != null) {
-			rep.setRedirectUris(new LinkedList<String>(redirectUris));
-		}
-
-		Set<String> webOrigins = applicationModel.getWebOrigins();
-		if (webOrigins != null) {
-			rep.setWebOrigins(new LinkedList<String>(webOrigins));
-		}
-
-		if (!applicationModel.getDefaultRoles().isEmpty()) {
-			rep.setDefaultRoles(applicationModel.getDefaultRoles().toArray(new String[0]));
-		}
-
-		if (!applicationModel.getRegisteredNodes().isEmpty()) {
-			rep.setRegisteredNodes(new HashMap<String, Integer>(applicationModel.getRegisteredNodes()));
-		}
-
-		if (!applicationModel.getIdentityProviders().isEmpty()) {
-			rep.setIdentityProviders(toRepresentation(applicationModel.getIdentityProviders()));
-		}
-
-		if (!applicationModel.getProtocolMappers().isEmpty()) {
-			List<ProtocolMapperRepresentation> mappings = new LinkedList<ProtocolMapperRepresentation>();
-			for (ProtocolMapperModel model : applicationModel.getProtocolMappers()) {
-				mappings.add(toRepresentation(model));
-			}
-			rep.setProtocolMappers(mappings);
-		}
-
-		return rep;
-	}
-
-	private static List<ClientIdentityProviderMappingRepresentation> toRepresentation(
-			List<ClientIdentityProviderMappingModel> identityProviders) {
-		ArrayList<ClientIdentityProviderMappingRepresentation> representations = new ArrayList<ClientIdentityProviderMappingRepresentation>();
-
-		for (ClientIdentityProviderMappingModel model : identityProviders) {
-			ClientIdentityProviderMappingRepresentation representation = new ClientIdentityProviderMappingRepresentation();
-
-			representation.setId(model.getIdentityProvider());
-			representation.setRetrieveToken(model.isRetrieveToken());
-
-			representations.add(representation);
-		}
-
-		return representations;
-	}
-
-	public static OAuthClientRepresentation toRepresentation(OAuthClientModel model) {
-		OAuthClientRepresentation rep = new OAuthClientRepresentation();
-		rep.setId(model.getId());
-		rep.setName(model.getClientId());
-		rep.setEnabled(model.isEnabled());
-		rep.setPublicClient(model.isPublicClient());
-		rep.setFrontchannelLogout(model.isFrontchannelLogout());
-		rep.setProtocol(model.getProtocol());
-		rep.setAttributes(model.getAttributes());
-		rep.setFullScopeAllowed(model.isFullScopeAllowed());
-		rep.setDirectGrantsOnly(model.isDirectGrantsOnly());
-		Set<String> redirectUris = model.getRedirectUris();
-		if (redirectUris != null) {
-			rep.setRedirectUris(new LinkedList<String>(redirectUris));
-		}
-
-		Set<String> webOrigins = model.getWebOrigins();
-		if (webOrigins != null) {
-			rep.setWebOrigins(new LinkedList<String>(webOrigins));
-		}
-		rep.setNotBefore(model.getNotBefore());
-
-		if (!model.getIdentityProviders().isEmpty()) {
-			rep.setIdentityProviders(toRepresentation(model.getIdentityProviders()));
-		}
-
-		if (!model.getProtocolMappers().isEmpty()) {
-			List<ProtocolMapperRepresentation> mappings = new LinkedList<ProtocolMapperRepresentation>();
-			for (ProtocolMapperModel mapper : model.getProtocolMappers()) {
-				mappings.add(toRepresentation(mapper));
-			}
-			rep.setProtocolMappers(mappings);
-		}
-
-		return rep;
-	}
-
-	public static UserFederationProviderRepresentation toRepresentation(UserFederationProviderModel model) {
-		UserFederationProviderRepresentation rep = new UserFederationProviderRepresentation();
-		rep.setId(model.getId());
-		rep.setConfig(model.getConfig());
-		rep.setProviderName(model.getProviderName());
-		rep.setPriority(model.getPriority());
-		rep.setDisplayName(model.getDisplayName());
-		rep.setFullSyncPeriod(model.getFullSyncPeriod());
-		rep.setChangedSyncPeriod(model.getChangedSyncPeriod());
-		rep.setLastSync(model.getLastSync());
-		return rep;
-	}
-
-	public static IdentityProviderRepresentation toRepresentation(IdentityProviderModel identityProviderModel) {
-		IdentityProviderRepresentation providerRep = new IdentityProviderRepresentation();
-
-		providerRep.setInternalId(identityProviderModel.getInternalId());
-		providerRep.setProviderId(identityProviderModel.getProviderId());
-		providerRep.setId(identityProviderModel.getId());
-		providerRep.setName(identityProviderModel.getName());
-		providerRep.setEnabled(identityProviderModel.isEnabled());
-		providerRep.setStoreToken(identityProviderModel.isStoreToken());
-		providerRep.setUpdateProfileFirstLogin(identityProviderModel.isUpdateProfileFirstLogin());
-		providerRep.setAuthenticateByDefault(identityProviderModel.isAuthenticateByDefault());
-		providerRep.setConfig(identityProviderModel.getConfig());
-
-		return providerRep;
-	}
-
-	public static ProtocolMapperRepresentation toRepresentation(ProtocolMapperModel model) {
-		ProtocolMapperRepresentation rep = new ProtocolMapperRepresentation();
-		rep.setId(model.getId());
-		rep.setProtocol(model.getProtocol());
-		Map<String, String> config = new HashMap<String, String>();
-		config.putAll(model.getConfig());
-		rep.setConfig(config);
-		rep.setName(model.getName());
-		rep.setProtocolMapper(model.getProtocolMapper());
-		rep.setConsentText(model.getConsentText());
-		rep.setConsentRequired(model.isConsentRequired());
-		return rep;
-	}
+    public static UserRepresentation toRepresentation(UserModel user) {
+        UserRepresentation rep = new UserRepresentation();
+        rep.setId(user.getId());
+        rep.setUsername(user.getUsername());
+        rep.setLastName(user.getLastName());
+        rep.setFirstName(user.getFirstName());
+        rep.setEmail(user.getEmail());
+        rep.setEnabled(user.isEnabled());
+        rep.setEmailVerified(user.isEmailVerified());
+        rep.setTotp(user.isTotp());
+        rep.setFederationLink(user.getFederationLink());
+
+        List<String> reqActions = new ArrayList<String>();
+        for (UserModel.RequiredAction ra : user.getRequiredActions()) {
+            reqActions.add(ra.name());
+        }
+
+        rep.setRequiredActions(reqActions);
+
+        if (user.getAttributes() != null && !user.getAttributes().isEmpty()) {
+            Map<String, String> attrs = new HashMap<String, String>();
+            attrs.putAll(user.getAttributes());
+            rep.setAttributes(attrs);
+        }
+        return rep;
+    }
+
+    public static RoleRepresentation toRepresentation(RoleModel role) {
+        RoleRepresentation rep = new RoleRepresentation();
+        rep.setId(role.getId());
+        rep.setName(role.getName());
+        rep.setDescription(role.getDescription());
+        rep.setComposite(role.isComposite());
+        return rep;
+    }
+
+    public static RealmRepresentation toRepresentation(RealmModel realm, boolean internal) {
+        RealmRepresentation rep = new RealmRepresentation();
+        rep.setId(realm.getId());
+        rep.setRealm(realm.getName());
+        rep.setEnabled(realm.isEnabled());
+        rep.setNotBefore(realm.getNotBefore());
+        rep.setSslRequired(realm.getSslRequired().name().toLowerCase());
+        rep.setPublicKey(realm.getPublicKeyPem());
+        if (internal) {
+            rep.setPrivateKey(realm.getPrivateKeyPem());
+            String privateKeyPem = realm.getPrivateKeyPem();
+            if (realm.getCertificatePem() == null && privateKeyPem != null) {
+                KeycloakModelUtils.generateRealmCertificate(realm);
+            }
+            rep.setCodeSecret(realm.getCodeSecret());
+        }
+        rep.setCertificate(realm.getCertificatePem());
+        rep.setPasswordCredentialGrantAllowed(realm.isPasswordCredentialGrantAllowed());
+        rep.setRegistrationAllowed(realm.isRegistrationAllowed());
+        rep.setRegistrationEmailAsUsername(realm.isRegistrationEmailAsUsername());
+        rep.setRememberMe(realm.isRememberMe());
+        rep.setBruteForceProtected(realm.isBruteForceProtected());
+        rep.setMaxFailureWaitSeconds(realm.getMaxFailureWaitSeconds());
+        rep.setMinimumQuickLoginWaitSeconds(realm.getMinimumQuickLoginWaitSeconds());
+        rep.setWaitIncrementSeconds(realm.getWaitIncrementSeconds());
+        rep.setQuickLoginCheckMilliSeconds(realm.getQuickLoginCheckMilliSeconds());
+        rep.setMaxDeltaTimeSeconds(realm.getMaxDeltaTimeSeconds());
+        rep.setFailureFactor(realm.getFailureFactor());
+        rep.setVerifyEmail(realm.isVerifyEmail());
+        rep.setResetPasswordAllowed(realm.isResetPasswordAllowed());
+        rep.setAccessTokenLifespan(realm.getAccessTokenLifespan());
+        rep.setSsoSessionIdleTimeout(realm.getSsoSessionIdleTimeout());
+        rep.setSsoSessionMaxLifespan(realm.getSsoSessionMaxLifespan());
+        rep.setAccessCodeLifespan(realm.getAccessCodeLifespan());
+        rep.setAccessCodeLifespanUserAction(realm.getAccessCodeLifespanUserAction());
+        rep.setAccessCodeLifespanLogin(realm.getAccessCodeLifespanLogin());
+        rep.setSmtpServer(realm.getSmtpConfig());
+        rep.setBrowserSecurityHeaders(realm.getBrowserSecurityHeaders());
+        rep.setAccountTheme(realm.getAccountTheme());
+        rep.setLoginTheme(realm.getLoginTheme());
+        rep.setAdminTheme(realm.getAdminTheme());
+        rep.setEmailTheme(realm.getEmailTheme());
+        if (realm.getPasswordPolicy() != null) {
+            rep.setPasswordPolicy(realm.getPasswordPolicy().toString());
+        }
+
+        List<String> defaultRoles = realm.getDefaultRoles();
+        if (!defaultRoles.isEmpty()) {
+            List<String> roleStrings = new ArrayList<String>();
+            roleStrings.addAll(defaultRoles);
+            rep.setDefaultRoles(roleStrings);
+        }
+
+        List<RequiredCredentialModel> requiredCredentialModels = realm.getRequiredCredentials();
+        if (requiredCredentialModels.size() > 0) {
+            rep.setRequiredCredentials(new HashSet<String>());
+            for (RequiredCredentialModel cred : requiredCredentialModels) {
+                rep.getRequiredCredentials().add(cred.getType());
+            }
+        }
+
+        List<UserFederationProviderModel> fedProviderModels = realm.getUserFederationProviders();
+        if (fedProviderModels.size() > 0) {
+            List<UserFederationProviderRepresentation> fedProviderReps = new ArrayList<UserFederationProviderRepresentation>();
+            for (UserFederationProviderModel model : fedProviderModels) {
+                UserFederationProviderRepresentation fedProvRep = toRepresentation(model);
+                fedProviderReps.add(fedProvRep);
+            }
+            rep.setUserFederationProviders(fedProviderReps);
+        }
+
+        for (IdentityProviderModel provider : realm.getIdentityProviders()) {
+            rep.addIdentityProvider(toRepresentation(provider));
+        }
+
+        return rep;
+    }
+
+    public static RealmEventsConfigRepresentation toEventsConfigReprensetation(RealmModel realm) {
+        RealmEventsConfigRepresentation rep = new RealmEventsConfigRepresentation();
+        rep.setEventsEnabled(realm.isEventsEnabled());
+
+        if (realm.getEventsExpiration() != 0) {
+            rep.setEventsExpiration(realm.getEventsExpiration());
+        }
+
+        if (realm.getEventsListeners() != null) {
+            rep.setEventsListeners(new LinkedList<String>(realm.getEventsListeners()));
+        }
+        return rep;
+    }
+
+    public static CredentialRepresentation toRepresentation(UserCredentialModel cred) {
+        CredentialRepresentation rep = new CredentialRepresentation();
+        rep.setType(CredentialRepresentation.SECRET);
+        rep.setValue(cred.getValue());
+        return rep;
+    }
+
+    public static ClaimRepresentation toRepresentation(ClientModel model) {
+        ClaimRepresentation rep = new ClaimRepresentation();
+        rep.setAddress(ClaimMask.hasAddress(model.getAllowedClaimsMask()));
+        rep.setEmail(ClaimMask.hasEmail(model.getAllowedClaimsMask()));
+        rep.setGender(ClaimMask.hasGender(model.getAllowedClaimsMask()));
+        rep.setLocale(ClaimMask.hasLocale(model.getAllowedClaimsMask()));
+        rep.setName(ClaimMask.hasName(model.getAllowedClaimsMask()));
+        rep.setPhone(ClaimMask.hasPhone(model.getAllowedClaimsMask()));
+        rep.setPicture(ClaimMask.hasPicture(model.getAllowedClaimsMask()));
+        rep.setProfile(ClaimMask.hasProfile(model.getAllowedClaimsMask()));
+        rep.setWebsite(ClaimMask.hasWebsite(model.getAllowedClaimsMask()));
+        rep.setUsername(ClaimMask.hasUsername(model.getAllowedClaimsMask()));
+        return rep;
+    }
+
+    public static FederatedIdentityRepresentation toRepresentation(FederatedIdentityModel socialLink) {
+        FederatedIdentityRepresentation rep = new FederatedIdentityRepresentation();
+        rep.setUserName(socialLink.getUserName());
+        rep.setIdentityProvider(socialLink.getIdentityProvider());
+        rep.setUserId(socialLink.getUserId());
+        return rep;
+    }
+
+    public static UserSessionRepresentation toRepresentation(UserSessionModel session) {
+        UserSessionRepresentation rep = new UserSessionRepresentation();
+        rep.setId(session.getId());
+        rep.setStart(((long) session.getStarted()) * 1000L);
+        rep.setLastAccess(((long) session.getLastSessionRefresh()) * 1000L);
+        rep.setUser(session.getUser().getUsername());
+        rep.setIpAddress(session.getIpAddress());
+        for (ClientSessionModel clientSession : session.getClientSessions()) {
+            ClientModel client = clientSession.getClient();
+            if (client instanceof ApplicationModel) {
+                rep.getApplications().put(client.getId(), client.getClientId());
+            } else if (client instanceof OAuthClientModel) {
+                rep.getClients().put(client.getId(), client.getClientId());
+            }
+        }
+        return rep;
+    }
+
+    public static ApplicationRepresentation toRepresentation(ApplicationModel applicationModel) {
+        ApplicationRepresentation rep = new ApplicationRepresentation();
+        rep.setId(applicationModel.getId());
+        rep.setName(applicationModel.getName());
+        rep.setEnabled(applicationModel.isEnabled());
+        rep.setAdminUrl(applicationModel.getManagementUrl());
+        rep.setPublicClient(applicationModel.isPublicClient());
+        rep.setFrontchannelLogout(applicationModel.isFrontchannelLogout());
+        rep.setProtocol(applicationModel.getProtocol());
+        rep.setAttributes(applicationModel.getAttributes());
+        rep.setFullScopeAllowed(applicationModel.isFullScopeAllowed());
+        rep.setBearerOnly(applicationModel.isBearerOnly());
+        rep.setSurrogateAuthRequired(applicationModel.isSurrogateAuthRequired());
+        rep.setBaseUrl(applicationModel.getBaseUrl());
+        rep.setNotBefore(applicationModel.getNotBefore());
+        rep.setNodeReRegistrationTimeout(applicationModel.getNodeReRegistrationTimeout());
+
+        Set<String> redirectUris = applicationModel.getRedirectUris();
+        if (redirectUris != null) {
+            rep.setRedirectUris(new LinkedList<String>(redirectUris));
+        }
+
+        Set<String> webOrigins = applicationModel.getWebOrigins();
+        if (webOrigins != null) {
+            rep.setWebOrigins(new LinkedList<String>(webOrigins));
+        }
+
+        if (!applicationModel.getDefaultRoles().isEmpty()) {
+            rep.setDefaultRoles(applicationModel.getDefaultRoles().toArray(new String[0]));
+        }
+
+        if (!applicationModel.getRegisteredNodes().isEmpty()) {
+            rep.setRegisteredNodes(new HashMap<String, Integer>(applicationModel.getRegisteredNodes()));
+        }
+
+        if (!applicationModel.getIdentityProviders().isEmpty()) {
+            rep.setIdentityProviders(toRepresentation(applicationModel.getIdentityProviders()));
+        }
+
+        if (!applicationModel.getProtocolMappers().isEmpty()) {
+            List<ProtocolMapperRepresentation> mappings = new LinkedList<ProtocolMapperRepresentation>();
+            for (ProtocolMapperModel model : applicationModel.getProtocolMappers()) {
+                mappings.add(toRepresentation(model));
+            }
+            rep.setProtocolMappers(mappings);
+        }
+
+        return rep;
+    }
+
+    private static List<ClientIdentityProviderMappingRepresentation> toRepresentation(
+            List<ClientIdentityProviderMappingModel> identityProviders) {
+        ArrayList<ClientIdentityProviderMappingRepresentation> representations = new ArrayList<ClientIdentityProviderMappingRepresentation>();
+
+        for (ClientIdentityProviderMappingModel model : identityProviders) {
+            ClientIdentityProviderMappingRepresentation representation = new ClientIdentityProviderMappingRepresentation();
+
+            representation.setId(model.getIdentityProvider());
+            representation.setRetrieveToken(model.isRetrieveToken());
+
+            representations.add(representation);
+        }
+
+        return representations;
+    }
+
+    public static OAuthClientRepresentation toRepresentation(OAuthClientModel model) {
+        OAuthClientRepresentation rep = new OAuthClientRepresentation();
+        rep.setId(model.getId());
+        rep.setName(model.getClientId());
+        rep.setEnabled(model.isEnabled());
+        rep.setPublicClient(model.isPublicClient());
+        rep.setFrontchannelLogout(model.isFrontchannelLogout());
+        rep.setProtocol(model.getProtocol());
+        rep.setAttributes(model.getAttributes());
+        rep.setFullScopeAllowed(model.isFullScopeAllowed());
+        rep.setDirectGrantsOnly(model.isDirectGrantsOnly());
+        Set<String> redirectUris = model.getRedirectUris();
+        if (redirectUris != null) {
+            rep.setRedirectUris(new LinkedList<String>(redirectUris));
+        }
+
+        Set<String> webOrigins = model.getWebOrigins();
+        if (webOrigins != null) {
+            rep.setWebOrigins(new LinkedList<String>(webOrigins));
+        }
+        rep.setNotBefore(model.getNotBefore());
+
+        if (!model.getIdentityProviders().isEmpty()) {
+            rep.setIdentityProviders(toRepresentation(model.getIdentityProviders()));
+        }
+
+        if (!model.getProtocolMappers().isEmpty()) {
+            List<ProtocolMapperRepresentation> mappings = new LinkedList<ProtocolMapperRepresentation>();
+            for (ProtocolMapperModel mapper : model.getProtocolMappers()) {
+                mappings.add(toRepresentation(mapper));
+            }
+            rep.setProtocolMappers(mappings);
+        }
+
+        return rep;
+    }
+
+    public static UserFederationProviderRepresentation toRepresentation(UserFederationProviderModel model) {
+        UserFederationProviderRepresentation rep = new UserFederationProviderRepresentation();
+        rep.setId(model.getId());
+        rep.setConfig(model.getConfig());
+        rep.setProviderName(model.getProviderName());
+        rep.setPriority(model.getPriority());
+        rep.setDisplayName(model.getDisplayName());
+        rep.setFullSyncPeriod(model.getFullSyncPeriod());
+        rep.setChangedSyncPeriod(model.getChangedSyncPeriod());
+        rep.setLastSync(model.getLastSync());
+        return rep;
+    }
+
+    public static IdentityProviderRepresentation toRepresentation(IdentityProviderModel identityProviderModel) {
+        IdentityProviderRepresentation providerRep = new IdentityProviderRepresentation();
+
+        providerRep.setInternalId(identityProviderModel.getInternalId());
+        providerRep.setProviderId(identityProviderModel.getProviderId());
+        providerRep.setId(identityProviderModel.getId());
+        providerRep.setName(identityProviderModel.getName());
+        providerRep.setEnabled(identityProviderModel.isEnabled());
+        providerRep.setStoreToken(identityProviderModel.isStoreToken());
+        providerRep.setUpdateProfileFirstLogin(identityProviderModel.isUpdateProfileFirstLogin());
+        providerRep.setAuthenticateByDefault(identityProviderModel.isAuthenticateByDefault());
+        providerRep.setConfig(identityProviderModel.getConfig());
+
+        return providerRep;
+    }
+
+    public static ProtocolMapperRepresentation toRepresentation(ProtocolMapperModel model) {
+        ProtocolMapperRepresentation rep = new ProtocolMapperRepresentation();
+        rep.setId(model.getId());
+        rep.setProtocol(model.getProtocol());
+        Map<String, String> config = new HashMap<String, String>();
+        config.putAll(model.getConfig());
+        rep.setConfig(config);
+        rep.setName(model.getName());
+        rep.setProtocolMapper(model.getProtocolMapper());
+        rep.setConsentText(model.getConsentText());
+        rep.setConsentRequired(model.isConsentRequired());
+        return rep;
+    }
 
 }
diff --git a/model/api/src/main/java/org/keycloak/models/utils/RepresentationToModel.java b/model/api/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
index 3154ad4..66e561d 100755
--- a/model/api/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
+++ b/model/api/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
@@ -46,902 +46,902 @@ import org.keycloak.representations.idm.UserRepresentation;
 
 public class RepresentationToModel {
 
-	private static Logger logger = Logger.getLogger(RepresentationToModel.class);
-
-	public static void importRealm(KeycloakSession session, RealmRepresentation rep, RealmModel newRealm) {
-		newRealm.setName(rep.getRealm());
-		if (rep.isEnabled() != null)
-			newRealm.setEnabled(rep.isEnabled());
-		if (rep.isBruteForceProtected() != null)
-			newRealm.setBruteForceProtected(rep.isBruteForceProtected());
-		if (rep.getMaxFailureWaitSeconds() != null)
-			newRealm.setMaxFailureWaitSeconds(rep.getMaxFailureWaitSeconds());
-		if (rep.getMinimumQuickLoginWaitSeconds() != null)
-			newRealm.setMinimumQuickLoginWaitSeconds(rep.getMinimumQuickLoginWaitSeconds());
-		if (rep.getWaitIncrementSeconds() != null)
-			newRealm.setWaitIncrementSeconds(rep.getWaitIncrementSeconds());
-		if (rep.getQuickLoginCheckMilliSeconds() != null)
-			newRealm.setQuickLoginCheckMilliSeconds(rep.getQuickLoginCheckMilliSeconds());
-		if (rep.getMaxDeltaTimeSeconds() != null)
-			newRealm.setMaxDeltaTimeSeconds(rep.getMaxDeltaTimeSeconds());
-		if (rep.getFailureFactor() != null)
-			newRealm.setFailureFactor(rep.getFailureFactor());
-		if (rep.isEventsEnabled() != null)
-			newRealm.setEventsEnabled(rep.isEventsEnabled());
-		if (rep.getEventsExpiration() != null)
-			newRealm.setEventsExpiration(rep.getEventsExpiration());
-		if (rep.getEventsListeners() != null)
-			newRealm.setEventsListeners(new HashSet<String>(rep.getEventsListeners()));
-
-		if (rep.getNotBefore() != null)
-			newRealm.setNotBefore(rep.getNotBefore());
-
-		if (rep.getAccessTokenLifespan() != null)
-			newRealm.setAccessTokenLifespan(rep.getAccessTokenLifespan());
-		else
-			newRealm.setAccessTokenLifespan(300);
-
-		if (rep.getSsoSessionIdleTimeout() != null)
-			newRealm.setSsoSessionIdleTimeout(rep.getSsoSessionIdleTimeout());
-		else
-			newRealm.setSsoSessionIdleTimeout(1800);
-		if (rep.getSsoSessionMaxLifespan() != null)
-			newRealm.setSsoSessionMaxLifespan(rep.getSsoSessionMaxLifespan());
-		else
-			newRealm.setSsoSessionMaxLifespan(36000);
-
-		if (rep.getAccessCodeLifespan() != null)
-			newRealm.setAccessCodeLifespan(rep.getAccessCodeLifespan());
-		else
-			newRealm.setAccessCodeLifespan(60);
-
-		if (rep.getAccessCodeLifespanUserAction() != null)
-			newRealm.setAccessCodeLifespanUserAction(rep.getAccessCodeLifespanUserAction());
-		else
-			newRealm.setAccessCodeLifespanUserAction(300);
-
-		if (rep.getAccessCodeLifespanLogin() != null)
-			newRealm.setAccessCodeLifespanLogin(rep.getAccessCodeLifespanLogin());
-		else
-			newRealm.setAccessCodeLifespanLogin(1800);
-
-		if (rep.getSslRequired() != null)
-			newRealm.setSslRequired(SslRequired.valueOf(rep.getSslRequired().toUpperCase()));
-		if (rep.isPasswordCredentialGrantAllowed() != null)
-			newRealm.setPasswordCredentialGrantAllowed(rep.isPasswordCredentialGrantAllowed());
-		if (rep.isRegistrationAllowed() != null)
-			newRealm.setRegistrationAllowed(rep.isRegistrationAllowed());
-		if (rep.isRegistrationEmailAsUsername() != null)
-			newRealm.setRegistrationEmailAsUsername(rep.isRegistrationEmailAsUsername());
-		if (rep.isRememberMe() != null)
-			newRealm.setRememberMe(rep.isRememberMe());
-		if (rep.isVerifyEmail() != null)
-			newRealm.setVerifyEmail(rep.isVerifyEmail());
-		if (rep.isResetPasswordAllowed() != null)
-			newRealm.setResetPasswordAllowed(rep.isResetPasswordAllowed());
-		if (rep.getPrivateKey() == null || rep.getPublicKey() == null) {
-			KeycloakModelUtils.generateRealmKeys(newRealm);
-		} else {
-			newRealm.setPrivateKeyPem(rep.getPrivateKey());
-			newRealm.setPublicKeyPem(rep.getPublicKey());
-		}
-		if (rep.getCertificate() == null) {
-			KeycloakModelUtils.generateRealmCertificate(newRealm);
-		} else {
-			newRealm.setCertificatePem(rep.getCertificate());
-		}
-		if (rep.getCodeSecret() == null) {
-			newRealm.setCodeSecret(KeycloakModelUtils.generateCodeSecret());
-		} else {
-			newRealm.setCodeSecret(rep.getCodeSecret());
-		}
-
-		if (rep.getLoginTheme() != null)
-			newRealm.setLoginTheme(rep.getLoginTheme());
-		if (rep.getAccountTheme() != null)
-			newRealm.setAccountTheme(rep.getAccountTheme());
-		if (rep.getAdminTheme() != null)
-			newRealm.setAdminTheme(rep.getAdminTheme());
-		if (rep.getEmailTheme() != null)
-			newRealm.setEmailTheme(rep.getEmailTheme());
-
-		if (rep.getRequiredCredentials() != null) {
-			for (String requiredCred : rep.getRequiredCredentials()) {
-				addRequiredCredential(newRealm, requiredCred);
-			}
-		} else {
-			addRequiredCredential(newRealm, CredentialRepresentation.PASSWORD);
-		}
-
-		if (rep.getPasswordPolicy() != null)
-			newRealm.setPasswordPolicy(new PasswordPolicy(rep.getPasswordPolicy()));
-
-		importIdentityProviders(rep, newRealm);
-
-		if (rep.getApplications() != null) {
-			Map<String, ApplicationModel> appMap = createApplications(rep, newRealm);
-		}
-
-		if (rep.getRoles() != null) {
-			if (rep.getRoles().getRealm() != null) { // realm roles
-				for (RoleRepresentation roleRep : rep.getRoles().getRealm()) {
-					createRole(newRealm, roleRep);
-				}
-			}
-			if (rep.getRoles().getApplication() != null) {
-				for (Map.Entry<String, List<RoleRepresentation>> entry : rep.getRoles().getApplication().entrySet()) {
-					ApplicationModel app = newRealm.getApplicationByName(entry.getKey());
-					if (app == null) {
-						throw new RuntimeException("App doesn't exist in role definitions: " + entry.getKey());
-					}
-					for (RoleRepresentation roleRep : entry.getValue()) {
-						// Application role may already exists (for example if it is defaultRole)
-						RoleModel role = roleRep.getId() != null ? app.addRole(roleRep.getId(), roleRep.getName()) : app
-								.addRole(roleRep.getName());
-						role.setDescription(roleRep.getDescription());
-					}
-				}
-			}
-			// now that all roles are created, re-iterate and set up composites
-			if (rep.getRoles().getRealm() != null) { // realm roles
-				for (RoleRepresentation roleRep : rep.getRoles().getRealm()) {
-					RoleModel role = newRealm.getRole(roleRep.getName());
-					addComposites(role, roleRep, newRealm);
-				}
-			}
-			if (rep.getRoles().getApplication() != null) {
-				for (Map.Entry<String, List<RoleRepresentation>> entry : rep.getRoles().getApplication().entrySet()) {
-					ApplicationModel app = newRealm.getApplicationByName(entry.getKey());
-					if (app == null) {
-						throw new RuntimeException("App doesn't exist in role definitions: " + entry.getKey());
-					}
-					for (RoleRepresentation roleRep : entry.getValue()) {
-						RoleModel role = app.getRole(roleRep.getName());
-						addComposites(role, roleRep, newRealm);
-					}
-				}
-			}
-		}
-
-		// Setup realm default roles
-		if (rep.getDefaultRoles() != null) {
-			for (String roleString : rep.getDefaultRoles()) {
-				newRealm.addDefaultRole(roleString.trim());
-			}
-		}
-		// Setup application default roles
-		if (rep.getApplications() != null) {
-			for (ApplicationRepresentation resourceRep : rep.getApplications()) {
-				if (resourceRep.getDefaultRoles() != null) {
-					ApplicationModel appModel = newRealm.getApplicationByName(resourceRep.getName());
-					appModel.updateDefaultRoles(resourceRep.getDefaultRoles());
-				}
-			}
-		}
-
-		if (rep.getOauthClients() != null) {
-			createOAuthClients(rep, newRealm);
-		}
-
-		// Now that all possible roles and applications are created, create scope mappings
-
-		Map<String, ApplicationModel> appMap = newRealm.getApplicationNameMap();
-
-		if (rep.getApplicationScopeMappings() != null) {
-
-			for (Map.Entry<String, List<ScopeMappingRepresentation>> entry : rep.getApplicationScopeMappings().entrySet()) {
-				ApplicationModel app = appMap.get(entry.getKey());
-				if (app == null) {
-					throw new RuntimeException("Unable to find application role mappings for app: " + entry.getKey());
-				}
-				createApplicationScopeMappings(newRealm, app, entry.getValue());
-			}
-		}
-
-		if (rep.getScopeMappings() != null) {
-			for (ScopeMappingRepresentation scope : rep.getScopeMappings()) {
-				ClientModel client = newRealm.findClient(scope.getClient());
-				if (client == null) {
-					throw new RuntimeException("Unknown client specification in realm scope mappings");
-				}
-				for (String roleString : scope.getRoles()) {
-					RoleModel role = newRealm.getRole(roleString.trim());
-					if (role == null) {
-						role = newRealm.addRole(roleString.trim());
-					}
-					client.addScopeMapping(role);
-				}
-
-			}
-		}
-
-		if (rep.getSmtpServer() != null) {
-			newRealm.setSmtpConfig(new HashMap(rep.getSmtpServer()));
-		}
-
-		if (rep.getBrowserSecurityHeaders() != null) {
-			newRealm.setBrowserSecurityHeaders(rep.getBrowserSecurityHeaders());
-		} else {
-			newRealm.setBrowserSecurityHeaders(BrowserSecurityHeaders.defaultHeaders);
-		}
-
-		if (rep.getUserFederationProviders() != null) {
-			List<UserFederationProviderModel> providerModels = convertFederationProviders(rep.getUserFederationProviders());
-			newRealm.setUserFederationProviders(providerModels);
-		}
-
-		// create users and their role mappings and social mappings
-
-		if (rep.getUsers() != null) {
-			for (UserRepresentation userRep : rep.getUsers()) {
-				UserModel user = createUser(session, newRealm, userRep, appMap);
-			}
-		}
-	}
-
-	public static void updateRealm(RealmRepresentation rep, RealmModel realm) {
-		if (rep.getRealm() != null) {
-			realm.setName(rep.getRealm());
-		}
-		if (rep.isEnabled() != null)
-			realm.setEnabled(rep.isEnabled());
-		if (rep.isBruteForceProtected() != null)
-			realm.setBruteForceProtected(rep.isBruteForceProtected());
-		if (rep.getMaxFailureWaitSeconds() != null)
-			realm.setMaxFailureWaitSeconds(rep.getMaxFailureWaitSeconds());
-		if (rep.getMinimumQuickLoginWaitSeconds() != null)
-			realm.setMinimumQuickLoginWaitSeconds(rep.getMinimumQuickLoginWaitSeconds());
-		if (rep.getWaitIncrementSeconds() != null)
-			realm.setWaitIncrementSeconds(rep.getWaitIncrementSeconds());
-		if (rep.getQuickLoginCheckMilliSeconds() != null)
-			realm.setQuickLoginCheckMilliSeconds(rep.getQuickLoginCheckMilliSeconds());
-		if (rep.getMaxDeltaTimeSeconds() != null)
-			realm.setMaxDeltaTimeSeconds(rep.getMaxDeltaTimeSeconds());
-		if (rep.getFailureFactor() != null)
-			realm.setFailureFactor(rep.getFailureFactor());
-		if (rep.isPasswordCredentialGrantAllowed() != null)
-			realm.setPasswordCredentialGrantAllowed(rep.isPasswordCredentialGrantAllowed());
-		if (rep.isRegistrationAllowed() != null)
-			realm.setRegistrationAllowed(rep.isRegistrationAllowed());
-		if (rep.isRegistrationEmailAsUsername() != null)
-			realm.setRegistrationEmailAsUsername(rep.isRegistrationEmailAsUsername());
-		if (rep.isRememberMe() != null)
-			realm.setRememberMe(rep.isRememberMe());
-		if (rep.isVerifyEmail() != null)
-			realm.setVerifyEmail(rep.isVerifyEmail());
-		if (rep.isResetPasswordAllowed() != null)
-			realm.setResetPasswordAllowed(rep.isResetPasswordAllowed());
-		if (rep.getSslRequired() != null)
-			realm.setSslRequired(SslRequired.valueOf(rep.getSslRequired().toUpperCase()));
-		if (rep.getAccessCodeLifespan() != null)
-			realm.setAccessCodeLifespan(rep.getAccessCodeLifespan());
-		if (rep.getAccessCodeLifespanUserAction() != null)
-			realm.setAccessCodeLifespanUserAction(rep.getAccessCodeLifespanUserAction());
-		if (rep.getAccessCodeLifespanLogin() != null)
-			realm.setAccessCodeLifespanLogin(rep.getAccessCodeLifespanLogin());
-		if (rep.getNotBefore() != null)
-			realm.setNotBefore(rep.getNotBefore());
-		if (rep.getAccessTokenLifespan() != null)
-			realm.setAccessTokenLifespan(rep.getAccessTokenLifespan());
-		if (rep.getSsoSessionIdleTimeout() != null)
-			realm.setSsoSessionIdleTimeout(rep.getSsoSessionIdleTimeout());
-		if (rep.getSsoSessionMaxLifespan() != null)
-			realm.setSsoSessionMaxLifespan(rep.getSsoSessionMaxLifespan());
-		if (rep.getRequiredCredentials() != null) {
-			realm.updateRequiredCredentials(rep.getRequiredCredentials());
-		}
-		if (rep.getLoginTheme() != null)
-			realm.setLoginTheme(rep.getLoginTheme());
-		if (rep.getAccountTheme() != null)
-			realm.setAccountTheme(rep.getAccountTheme());
-		if (rep.getAdminTheme() != null)
-			realm.setAdminTheme(rep.getAdminTheme());
-		if (rep.getEmailTheme() != null)
-			realm.setEmailTheme(rep.getEmailTheme());
-		if (rep.isEventsEnabled() != null)
-			realm.setEventsEnabled(rep.isEventsEnabled());
-		if (rep.getEventsExpiration() != null)
-			realm.setEventsExpiration(rep.getEventsExpiration());
-		if (rep.getEventsListeners() != null)
-			realm.setEventsListeners(new HashSet<String>(rep.getEventsListeners()));
-
-		if (rep.getPasswordPolicy() != null)
-			realm.setPasswordPolicy(new PasswordPolicy(rep.getPasswordPolicy()));
-
-		if (rep.getDefaultRoles() != null) {
-			realm.updateDefaultRoles(rep.getDefaultRoles().toArray(new String[rep.getDefaultRoles().size()]));
-		}
-
-		if (rep.getSmtpServer() != null) {
-			realm.setSmtpConfig(new HashMap(rep.getSmtpServer()));
-		}
-
-		if (rep.getBrowserSecurityHeaders() != null) {
-			realm.setBrowserSecurityHeaders(rep.getBrowserSecurityHeaders());
-		}
-
-		if (rep.getUserFederationProviders() != null) {
-			List<UserFederationProviderModel> providerModels = convertFederationProviders(rep.getUserFederationProviders());
-			realm.setUserFederationProviders(providerModels);
-		}
-
-		if ("GENERATE".equals(rep.getPublicKey())) {
-			KeycloakModelUtils.generateRealmKeys(realm);
-		}
-	}
-
-	// Basic realm stuff
-
-	public static void addRequiredCredential(RealmModel newRealm, String requiredCred) {
-		newRealm.addRequiredCredential(requiredCred);
-	}
-
-	private static List<UserFederationProviderModel> convertFederationProviders(
-			List<UserFederationProviderRepresentation> providers) {
-		List<UserFederationProviderModel> result = new ArrayList<UserFederationProviderModel>();
-
-		for (UserFederationProviderRepresentation representation : providers) {
-			UserFederationProviderModel model = new UserFederationProviderModel(representation.getId(),
-					representation.getProviderName(), representation.getConfig(), representation.getPriority(),
-					representation.getDisplayName(), representation.getFullSyncPeriod(), representation.getChangedSyncPeriod(),
-					representation.getLastSync());
-			result.add(model);
-		}
-		return result;
-	}
-
-	// Roles
-
-	public static void createRole(RealmModel newRealm, RoleRepresentation roleRep) {
-		RoleModel role = roleRep.getId() != null ? newRealm.addRole(roleRep.getId(), roleRep.getName()) : newRealm
-				.addRole(roleRep.getName());
-		if (roleRep.getDescription() != null)
-			role.setDescription(roleRep.getDescription());
-	}
-
-	private static void addComposites(RoleModel role, RoleRepresentation roleRep, RealmModel realm) {
-		if (roleRep.getComposites() == null)
-			return;
-		if (roleRep.getComposites().getRealm() != null) {
-			for (String roleStr : roleRep.getComposites().getRealm()) {
-				RoleModel realmRole = realm.getRole(roleStr);
-				if (realmRole == null)
-					throw new RuntimeException("Unable to find composite realm role: " + roleStr);
-				role.addCompositeRole(realmRole);
-			}
-		}
-		if (roleRep.getComposites().getApplication() != null) {
-			for (Map.Entry<String, List<String>> entry : roleRep.getComposites().getApplication().entrySet()) {
-				ApplicationModel app = realm.getApplicationByName(entry.getKey());
-				if (app == null) {
-					throw new RuntimeException("App doesn't exist in role definitions: " + roleRep.getName());
-				}
-				for (String roleStr : entry.getValue()) {
-					RoleModel appRole = app.getRole(roleStr);
-					if (appRole == null)
-						throw new RuntimeException("Unable to find composite app role: " + roleStr);
-					role.addCompositeRole(appRole);
-				}
-
-			}
-
-		}
-
-	}
-
-	// APPLICATIONS
-
-	private static Map<String, ApplicationModel> createApplications(RealmRepresentation rep, RealmModel realm) {
-		Map<String, ApplicationModel> appMap = new HashMap<String, ApplicationModel>();
-		for (ApplicationRepresentation resourceRep : rep.getApplications()) {
-			ApplicationModel app = createApplication(realm, resourceRep, false);
-			appMap.put(app.getName(), app);
-		}
-		return appMap;
-	}
-
-	/**
-	 * Does not create scope or role mappings!
-	 * 
-	 * @param realm
-	 * @param resourceRep
-	 * @return
-	 */
-	public static ApplicationModel createApplication(RealmModel realm, ApplicationRepresentation resourceRep,
-			boolean addDefaultRoles) {
-		logger.debug("************ CREATE APPLICATION: {0}" + resourceRep.getName());
-		ApplicationModel applicationModel = resourceRep.getId() != null ? realm.addApplication(resourceRep.getId(),
-				resourceRep.getName()) : realm.addApplication(resourceRep.getName());
-		if (resourceRep.isEnabled() != null)
-			applicationModel.setEnabled(resourceRep.isEnabled());
-		applicationModel.setManagementUrl(resourceRep.getAdminUrl());
-		if (resourceRep.isSurrogateAuthRequired() != null)
-			applicationModel.setSurrogateAuthRequired(resourceRep.isSurrogateAuthRequired());
-		applicationModel.setBaseUrl(resourceRep.getBaseUrl());
-		if (resourceRep.isBearerOnly() != null)
-			applicationModel.setBearerOnly(resourceRep.isBearerOnly());
-		if (resourceRep.isPublicClient() != null)
-			applicationModel.setPublicClient(resourceRep.isPublicClient());
-		if (resourceRep.isFrontchannelLogout() != null)
-			applicationModel.setFrontchannelLogout(resourceRep.isFrontchannelLogout());
-		if (resourceRep.getProtocol() != null)
-			applicationModel.setProtocol(resourceRep.getProtocol());
-		if (resourceRep.isFullScopeAllowed() != null) {
-			applicationModel.setFullScopeAllowed(resourceRep.isFullScopeAllowed());
-		} else {
-			applicationModel.setFullScopeAllowed(true);
-		}
-		if (resourceRep.getNodeReRegistrationTimeout() != null) {
-			applicationModel.setNodeReRegistrationTimeout(resourceRep.getNodeReRegistrationTimeout());
-		} else {
-			applicationModel.setNodeReRegistrationTimeout(-1);
-		}
-		applicationModel.updateApplication();
-
-		if (resourceRep.getNotBefore() != null) {
-			applicationModel.setNotBefore(resourceRep.getNotBefore());
-		}
-
-		applicationModel.setSecret(resourceRep.getSecret());
-		if (applicationModel.getSecret() == null) {
-			KeycloakModelUtils.generateSecret(applicationModel);
-		}
-
-		if (resourceRep.getAttributes() != null) {
-			for (Map.Entry<String, String> entry : resourceRep.getAttributes().entrySet()) {
-				applicationModel.setAttribute(entry.getKey(), entry.getValue());
-			}
-		}
-
-		if (resourceRep.getRedirectUris() != null) {
-			for (String redirectUri : resourceRep.getRedirectUris()) {
-				applicationModel.addRedirectUri(redirectUri);
-			}
-		}
-		if (resourceRep.getWebOrigins() != null) {
-			for (String webOrigin : resourceRep.getWebOrigins()) {
-				logger.debugv("Application: {0} webOrigin: {1}", resourceRep.getName(), webOrigin);
-				applicationModel.addWebOrigin(webOrigin);
-			}
-		} else {
-			// add origins from redirect uris
-			if (resourceRep.getRedirectUris() != null) {
-				Set<String> origins = new HashSet<String>();
-				for (String redirectUri : resourceRep.getRedirectUris()) {
-					logger.debugv("add redirect-uri to origin: {0}", redirectUri);
-					if (redirectUri.startsWith("http:")) {
-						URI uri = URI.create(redirectUri);
-						String origin = uri.getScheme() + "://" + uri.getHost();
-						if (uri.getPort() != -1) {
-							origin += ":" + uri.getPort();
-						}
-						logger.debugv("adding default application origin: {0}", origin);
-						origins.add(origin);
-					}
-				}
-				if (origins.size() > 0) {
-					applicationModel.setWebOrigins(origins);
-				}
-			}
-		}
-
-		if (resourceRep.getRegisteredNodes() != null) {
-			for (Map.Entry<String, Integer> entry : resourceRep.getRegisteredNodes().entrySet()) {
-				applicationModel.registerNode(entry.getKey(), entry.getValue());
-			}
-		}
-
-		if (addDefaultRoles && resourceRep.getDefaultRoles() != null) {
-			applicationModel.updateDefaultRoles(resourceRep.getDefaultRoles());
-		}
-
-		if (resourceRep.getProtocolMappers() != null) {
-			// first, remove all default/built in mappers
-			Set<ProtocolMapperModel> mappers = applicationModel.getProtocolMappers();
-			for (ProtocolMapperModel mapper : mappers)
-				applicationModel.removeProtocolMapper(mapper);
-
-			for (ProtocolMapperRepresentation mapper : resourceRep.getProtocolMappers()) {
-				applicationModel.addProtocolMapper(toModel(mapper));
-			}
-		}
-
-		applicationModel.updateAllowedIdentityProviders(toModel(resourceRep.getIdentityProviders(), realm));
-
-		return applicationModel;
-	}
-
-	public static void updateApplication(ApplicationRepresentation rep, ApplicationModel resource) {
-		if (rep.getName() != null)
-			resource.setName(rep.getName());
-		if (rep.isEnabled() != null)
-			resource.setEnabled(rep.isEnabled());
-		if (rep.isBearerOnly() != null)
-			resource.setBearerOnly(rep.isBearerOnly());
-		if (rep.isPublicClient() != null)
-			resource.setPublicClient(rep.isPublicClient());
-		if (rep.isFullScopeAllowed() != null)
-			resource.setFullScopeAllowed(rep.isFullScopeAllowed());
-		if (rep.isFrontchannelLogout() != null)
-			resource.setFrontchannelLogout(rep.isFrontchannelLogout());
-		if (rep.getAdminUrl() != null)
-			resource.setManagementUrl(rep.getAdminUrl());
-		if (rep.getBaseUrl() != null)
-			resource.setBaseUrl(rep.getBaseUrl());
-		if (rep.isSurrogateAuthRequired() != null)
-			resource.setSurrogateAuthRequired(rep.isSurrogateAuthRequired());
-		if (rep.getNodeReRegistrationTimeout() != null)
-			resource.setNodeReRegistrationTimeout(rep.getNodeReRegistrationTimeout());
-		resource.updateApplication();
-
-		if (rep.getProtocol() != null)
-			resource.setProtocol(rep.getProtocol());
-		if (rep.getAttributes() != null) {
-			for (Map.Entry<String, String> entry : rep.getAttributes().entrySet()) {
-				resource.setAttribute(entry.getKey(), entry.getValue());
-			}
-		}
-
-		if (rep.getNotBefore() != null) {
-			resource.setNotBefore(rep.getNotBefore());
-		}
-		if (rep.getDefaultRoles() != null) {
-			resource.updateDefaultRoles(rep.getDefaultRoles());
-		}
-
-		List<String> redirectUris = rep.getRedirectUris();
-		if (redirectUris != null) {
-			resource.setRedirectUris(new HashSet<String>(redirectUris));
-		}
-
-		List<String> webOrigins = rep.getWebOrigins();
-		if (webOrigins != null) {
-			resource.setWebOrigins(new HashSet<String>(webOrigins));
-		}
-
-		if (rep.getRegisteredNodes() != null) {
-			for (Map.Entry<String, Integer> entry : rep.getRegisteredNodes().entrySet()) {
-				resource.registerNode(entry.getKey(), entry.getValue());
-			}
-		}
-
-		updateClientIdentityProvides(rep.getIdentityProviders(), resource);
-	}
-
-	public static void setClaims(ClientModel model, ClaimRepresentation rep) {
-		long mask = model.getAllowedClaimsMask();
-		if (rep.getAddress()) {
-			mask |= ClaimMask.ADDRESS;
-		} else {
-			mask &= ~ClaimMask.ADDRESS;
-		}
-		if (rep.getEmail()) {
-			mask |= ClaimMask.EMAIL;
-		} else {
-			mask &= ~ClaimMask.EMAIL;
-		}
-		if (rep.getGender()) {
-			mask |= ClaimMask.GENDER;
-		} else {
-			mask &= ~ClaimMask.GENDER;
-		}
-		if (rep.getLocale()) {
-			mask |= ClaimMask.LOCALE;
-		} else {
-			mask &= ~ClaimMask.LOCALE;
-		}
-		if (rep.getName()) {
-			mask |= ClaimMask.NAME;
-		} else {
-			mask &= ~ClaimMask.NAME;
-		}
-		if (rep.getPhone()) {
-			mask |= ClaimMask.PHONE;
-		} else {
-			mask &= ~ClaimMask.PHONE;
-		}
-		if (rep.getPicture()) {
-			mask |= ClaimMask.PICTURE;
-		} else {
-			mask &= ~ClaimMask.PICTURE;
-		}
-		if (rep.getProfile()) {
-			mask |= ClaimMask.PROFILE;
-		} else {
-			mask &= ~ClaimMask.PROFILE;
-		}
-		if (rep.getUsername()) {
-			mask |= ClaimMask.USERNAME;
-		} else {
-			mask &= ~ClaimMask.USERNAME;
-		}
-		if (rep.getWebsite()) {
-			mask |= ClaimMask.WEBSITE;
-		} else {
-			mask &= ~ClaimMask.WEBSITE;
-		}
-		model.setAllowedClaimsMask(mask);
-	}
-
-	// OAuth clients
-
-	private static void createOAuthClients(RealmRepresentation realmRep, RealmModel realm) {
-		for (OAuthClientRepresentation rep : realmRep.getOauthClients()) {
-			createOAuthClient(rep, realm);
-		}
-	}
-
-	public static OAuthClientModel createOAuthClient(String id, String name, RealmModel realm) {
-		OAuthClientModel model = id != null ? realm.addOAuthClient(id, name) : realm.addOAuthClient(name);
-		KeycloakModelUtils.generateSecret(model);
-		return model;
-	}
-
-	public static OAuthClientModel createOAuthClient(OAuthClientRepresentation rep, RealmModel realm) {
-		OAuthClientModel model = createOAuthClient(rep.getId(), rep.getName(), realm);
-
-		model.updateAllowedIdentityProviders(toModel(rep.getIdentityProviders(), realm));
-
-		updateOAuthClient(rep, model);
-		return model;
-	}
-
-	public static void updateOAuthClient(OAuthClientRepresentation rep, OAuthClientModel model) {
-		if (rep.getName() != null)
-			model.setClientId(rep.getName());
-		if (rep.isEnabled() != null)
-			model.setEnabled(rep.isEnabled());
-		if (rep.isPublicClient() != null)
-			model.setPublicClient(rep.isPublicClient());
-		if (rep.isFrontchannelLogout() != null)
-			model.setFrontchannelLogout(rep.isFrontchannelLogout());
-		if (rep.isFullScopeAllowed() != null)
-			model.setFullScopeAllowed(rep.isFullScopeAllowed());
-		if (rep.isDirectGrantsOnly() != null)
-			model.setDirectGrantsOnly(rep.isDirectGrantsOnly());
-		if (rep.getClaims() != null) {
-			setClaims(model, rep.getClaims());
-		}
-		if (rep.getNotBefore() != null) {
-			model.setNotBefore(rep.getNotBefore());
-		}
-		if (rep.getSecret() != null)
-			model.setSecret(rep.getSecret());
-		List<String> redirectUris = rep.getRedirectUris();
-		if (redirectUris != null) {
-			model.setRedirectUris(new HashSet<String>(redirectUris));
-		}
-
-		List<String> webOrigins = rep.getWebOrigins();
-		if (webOrigins != null) {
-			model.setWebOrigins(new HashSet<String>(webOrigins));
-		}
-
-		if (rep.getNotBefore() != null) {
-			model.setNotBefore(rep.getNotBefore());
-		}
-		if (rep.getProtocol() != null)
-			model.setProtocol(rep.getProtocol());
-		if (rep.getAttributes() != null) {
-			for (Map.Entry<String, String> entry : rep.getAttributes().entrySet()) {
-				model.setAttribute(entry.getKey(), entry.getValue());
-			}
-		}
-
-		updateClientIdentityProvides(rep.getIdentityProviders(), model);
-
-		if (rep.getProtocolMappers() != null) {
-			// first, remove all default/built in mappers
-			Set<ProtocolMapperModel> mappers = model.getProtocolMappers();
-			for (ProtocolMapperModel mapper : mappers)
-				model.removeProtocolMapper(mapper);
-
-			for (ProtocolMapperRepresentation mapper : rep.getProtocolMappers()) {
-				model.addProtocolMapper(toModel(mapper));
-			}
-		}
-
-	}
-
-	// Scope mappings
-
-	public static void createApplicationScopeMappings(RealmModel realm, ApplicationModel applicationModel,
-			List<ScopeMappingRepresentation> mappings) {
-		for (ScopeMappingRepresentation mapping : mappings) {
-			ClientModel client = realm.findClient(mapping.getClient());
-			if (client == null) {
-				throw new RuntimeException("Unknown client specified in application scope mappings");
-			}
-			for (String roleString : mapping.getRoles()) {
-				RoleModel role = applicationModel.getRole(roleString.trim());
-				if (role == null) {
-					role = applicationModel.addRole(roleString.trim());
-				}
-				client.addScopeMapping(role);
-			}
-		}
-	}
-
-	// Users
-
-	public static UserModel createUser(KeycloakSession session, RealmModel newRealm, UserRepresentation userRep,
-			Map<String, ApplicationModel> appMap) {
-		// Import users just to user storage. Don't federate
-		UserModel user = session.userStorage().addUser(newRealm, userRep.getId(), userRep.getUsername(), false);
-		user.setEnabled(userRep.isEnabled());
-		user.setEmail(userRep.getEmail());
-		user.setFirstName(userRep.getFirstName());
-		user.setLastName(userRep.getLastName());
-		user.setFederationLink(userRep.getFederationLink());
-		user.setTotp(userRep.isTotp());
-		if (userRep.getAttributes() != null) {
-			for (Map.Entry<String, String> entry : userRep.getAttributes().entrySet()) {
-				user.setAttribute(entry.getKey(), entry.getValue());
-			}
-		}
-		if (userRep.getRequiredActions() != null) {
-			for (String requiredAction : userRep.getRequiredActions()) {
-				user.addRequiredAction(UserModel.RequiredAction.valueOf(requiredAction));
-			}
-		}
-		if (userRep.getCredentials() != null) {
-			for (CredentialRepresentation cred : userRep.getCredentials()) {
-				updateCredential(user, cred);
-			}
-		}
-		if (userRep.getFederatedIdentities() != null) {
-			for (FederatedIdentityRepresentation identity : userRep.getFederatedIdentities()) {
-				FederatedIdentityModel mappingModel = new FederatedIdentityModel(identity.getIdentityProvider(),
-						identity.getUserId(), identity.getUserName());
-				session.users().addFederatedIdentity(newRealm, user, mappingModel);
-			}
-		}
-		if (userRep.getRealmRoles() != null) {
-			for (String roleString : userRep.getRealmRoles()) {
-				RoleModel role = newRealm.getRole(roleString.trim());
-				if (role == null) {
-					role = newRealm.addRole(roleString.trim());
-				}
-				user.grantRole(role);
-			}
-		}
-		if (userRep.getApplicationRoles() != null) {
-			for (Map.Entry<String, List<String>> entry : userRep.getApplicationRoles().entrySet()) {
-				ApplicationModel app = appMap.get(entry.getKey());
-				if (app == null) {
-					throw new RuntimeException("Unable to find application role mappings for app: " + entry.getKey());
-				}
-				createApplicationRoleMappings(app, user, entry.getValue());
-			}
-		}
-		return user;
-	}
-
-	// Detect if it is "plain-text" or "hashed" representation and update model according to it
-	private static void updateCredential(UserModel user, CredentialRepresentation cred) {
-		if (cred.getValue() != null) {
-			UserCredentialModel plainTextCred = convertCredential(cred);
-			user.updateCredential(plainTextCred);
-		} else {
-			UserCredentialValueModel hashedCred = new UserCredentialValueModel();
-			hashedCred.setType(cred.getType());
-			hashedCred.setDevice(cred.getDevice());
-			hashedCred.setHashIterations(cred.getHashIterations());
-			try {
-				if (cred.getSalt() != null)
-					hashedCred.setSalt(Base64.decode(cred.getSalt()));
-			} catch (IOException ioe) {
-				throw new RuntimeException(ioe);
-			}
-			hashedCred.setValue(cred.getHashedSaltedValue());
-			user.updateCredentialDirectly(hashedCred);
-		}
-	}
-
-	public static UserCredentialModel convertCredential(CredentialRepresentation cred) {
-		UserCredentialModel credential = new UserCredentialModel();
-		credential.setType(cred.getType());
-		credential.setValue(cred.getValue());
-		return credential;
-	}
-
-	// Role mappings
-
-	public static void createApplicationRoleMappings(ApplicationModel applicationModel, UserModel user,
-			List<String> roleNames) {
-		if (user == null) {
-			throw new RuntimeException("User not found");
-		}
-
-		for (String roleName : roleNames) {
-			RoleModel role = applicationModel.getRole(roleName.trim());
-			if (role == null) {
-				role = applicationModel.addRole(roleName.trim());
-			}
-			user.grantRole(role);
-
-		}
-	}
-
-	private static void importIdentityProviders(RealmRepresentation rep, RealmModel newRealm) {
-		if (rep.getIdentityProviders() != null) {
-			for (IdentityProviderRepresentation representation : rep.getIdentityProviders()) {
-				newRealm.addIdentityProvider(toModel(representation));
-			}
-		}
-	}
-
-	public static IdentityProviderModel toModel(IdentityProviderRepresentation representation) {
-		IdentityProviderModel identityProviderModel = new IdentityProviderModel();
-
-		identityProviderModel.setInternalId(representation.getInternalId());
-		identityProviderModel.setId(representation.getId());
-		identityProviderModel.setProviderId(representation.getProviderId());
-		identityProviderModel.setName(representation.getName());
-		identityProviderModel.setEnabled(representation.isEnabled());
-		identityProviderModel.setUpdateProfileFirstLogin(representation.isUpdateProfileFirstLogin());
-		identityProviderModel.setAuthenticateByDefault(representation.isAuthenticateByDefault());
-		identityProviderModel.setStoreToken(representation.isStoreToken());
-		identityProviderModel.setConfig(representation.getConfig());
-
-		return identityProviderModel;
-	}
-
-	public static ProtocolMapperModel toModel(ProtocolMapperRepresentation rep) {
-		ProtocolMapperModel model = new ProtocolMapperModel();
-		model.setId(rep.getId());
-		model.setName(rep.getName());
-		model.setConsentRequired(rep.isConsentRequired());
-		model.setConsentText(rep.getConsentText());
-		model.setProtocol(rep.getProtocol());
-		model.setProtocolMapper(rep.getProtocolMapper());
-		model.setConfig(rep.getConfig());
-		return model;
-	}
-
-	private static List<ClientIdentityProviderMappingModel> toModel(
-			List<ClientIdentityProviderMappingRepresentation> repIdentityProviders, RealmModel realm) {
-		List<ClientIdentityProviderMappingModel> allowedIdentityProviders = new ArrayList<ClientIdentityProviderMappingModel>();
-
-		if (repIdentityProviders == null || repIdentityProviders.isEmpty()) {
-			allowedIdentityProviders = new ArrayList<ClientIdentityProviderMappingModel>();
-
-			for (IdentityProviderModel identityProvider : realm.getIdentityProviders()) {
-				ClientIdentityProviderMappingModel identityProviderMapping = new ClientIdentityProviderMappingModel();
-
-				identityProviderMapping.setIdentityProvider(identityProvider.getId());
-
-				allowedIdentityProviders.add(identityProviderMapping);
-			}
-		} else {
-			for (ClientIdentityProviderMappingRepresentation rep : repIdentityProviders) {
-				ClientIdentityProviderMappingModel identityProviderMapping = new ClientIdentityProviderMappingModel();
-
-				identityProviderMapping.setIdentityProvider(rep.getId());
-				identityProviderMapping.setRetrieveToken(rep.isRetrieveToken());
-
-				allowedIdentityProviders.add(identityProviderMapping);
-			}
-		}
-
-		return allowedIdentityProviders;
-	}
-
-	private static void updateClientIdentityProvides(List<ClientIdentityProviderMappingRepresentation> identityProviders,
-			ClientModel resource) {
-		if (identityProviders != null) {
-			List<ClientIdentityProviderMappingModel> allowedIdentityProviders = new ArrayList<ClientIdentityProviderMappingModel>();
-
-			for (ClientIdentityProviderMappingRepresentation mappingRepresentation : identityProviders) {
-				ClientIdentityProviderMappingModel identityProviderMapping = new ClientIdentityProviderMappingModel();
-
-				identityProviderMapping.setIdentityProvider(mappingRepresentation.getId());
-				identityProviderMapping.setRetrieveToken(mappingRepresentation.isRetrieveToken());
-
-				allowedIdentityProviders.add(identityProviderMapping);
-			}
-
-			resource.updateAllowedIdentityProviders(allowedIdentityProviders);
-		}
-	}
+    private static Logger logger = Logger.getLogger(RepresentationToModel.class);
+
+    public static void importRealm(KeycloakSession session, RealmRepresentation rep, RealmModel newRealm) {
+        newRealm.setName(rep.getRealm());
+        if (rep.isEnabled() != null)
+            newRealm.setEnabled(rep.isEnabled());
+        if (rep.isBruteForceProtected() != null)
+            newRealm.setBruteForceProtected(rep.isBruteForceProtected());
+        if (rep.getMaxFailureWaitSeconds() != null)
+            newRealm.setMaxFailureWaitSeconds(rep.getMaxFailureWaitSeconds());
+        if (rep.getMinimumQuickLoginWaitSeconds() != null)
+            newRealm.setMinimumQuickLoginWaitSeconds(rep.getMinimumQuickLoginWaitSeconds());
+        if (rep.getWaitIncrementSeconds() != null)
+            newRealm.setWaitIncrementSeconds(rep.getWaitIncrementSeconds());
+        if (rep.getQuickLoginCheckMilliSeconds() != null)
+            newRealm.setQuickLoginCheckMilliSeconds(rep.getQuickLoginCheckMilliSeconds());
+        if (rep.getMaxDeltaTimeSeconds() != null)
+            newRealm.setMaxDeltaTimeSeconds(rep.getMaxDeltaTimeSeconds());
+        if (rep.getFailureFactor() != null)
+            newRealm.setFailureFactor(rep.getFailureFactor());
+        if (rep.isEventsEnabled() != null)
+            newRealm.setEventsEnabled(rep.isEventsEnabled());
+        if (rep.getEventsExpiration() != null)
+            newRealm.setEventsExpiration(rep.getEventsExpiration());
+        if (rep.getEventsListeners() != null)
+            newRealm.setEventsListeners(new HashSet<String>(rep.getEventsListeners()));
+
+        if (rep.getNotBefore() != null)
+            newRealm.setNotBefore(rep.getNotBefore());
+
+        if (rep.getAccessTokenLifespan() != null)
+            newRealm.setAccessTokenLifespan(rep.getAccessTokenLifespan());
+        else
+            newRealm.setAccessTokenLifespan(300);
+
+        if (rep.getSsoSessionIdleTimeout() != null)
+            newRealm.setSsoSessionIdleTimeout(rep.getSsoSessionIdleTimeout());
+        else
+            newRealm.setSsoSessionIdleTimeout(1800);
+        if (rep.getSsoSessionMaxLifespan() != null)
+            newRealm.setSsoSessionMaxLifespan(rep.getSsoSessionMaxLifespan());
+        else
+            newRealm.setSsoSessionMaxLifespan(36000);
+
+        if (rep.getAccessCodeLifespan() != null)
+            newRealm.setAccessCodeLifespan(rep.getAccessCodeLifespan());
+        else
+            newRealm.setAccessCodeLifespan(60);
+
+        if (rep.getAccessCodeLifespanUserAction() != null)
+            newRealm.setAccessCodeLifespanUserAction(rep.getAccessCodeLifespanUserAction());
+        else
+            newRealm.setAccessCodeLifespanUserAction(300);
+
+        if (rep.getAccessCodeLifespanLogin() != null)
+            newRealm.setAccessCodeLifespanLogin(rep.getAccessCodeLifespanLogin());
+        else
+            newRealm.setAccessCodeLifespanLogin(1800);
+
+        if (rep.getSslRequired() != null)
+            newRealm.setSslRequired(SslRequired.valueOf(rep.getSslRequired().toUpperCase()));
+        if (rep.isPasswordCredentialGrantAllowed() != null)
+            newRealm.setPasswordCredentialGrantAllowed(rep.isPasswordCredentialGrantAllowed());
+        if (rep.isRegistrationAllowed() != null)
+            newRealm.setRegistrationAllowed(rep.isRegistrationAllowed());
+        if (rep.isRegistrationEmailAsUsername() != null)
+            newRealm.setRegistrationEmailAsUsername(rep.isRegistrationEmailAsUsername());
+        if (rep.isRememberMe() != null)
+            newRealm.setRememberMe(rep.isRememberMe());
+        if (rep.isVerifyEmail() != null)
+            newRealm.setVerifyEmail(rep.isVerifyEmail());
+        if (rep.isResetPasswordAllowed() != null)
+            newRealm.setResetPasswordAllowed(rep.isResetPasswordAllowed());
+        if (rep.getPrivateKey() == null || rep.getPublicKey() == null) {
+            KeycloakModelUtils.generateRealmKeys(newRealm);
+        } else {
+            newRealm.setPrivateKeyPem(rep.getPrivateKey());
+            newRealm.setPublicKeyPem(rep.getPublicKey());
+        }
+        if (rep.getCertificate() == null) {
+            KeycloakModelUtils.generateRealmCertificate(newRealm);
+        } else {
+            newRealm.setCertificatePem(rep.getCertificate());
+        }
+        if (rep.getCodeSecret() == null) {
+            newRealm.setCodeSecret(KeycloakModelUtils.generateCodeSecret());
+        } else {
+            newRealm.setCodeSecret(rep.getCodeSecret());
+        }
+
+        if (rep.getLoginTheme() != null)
+            newRealm.setLoginTheme(rep.getLoginTheme());
+        if (rep.getAccountTheme() != null)
+            newRealm.setAccountTheme(rep.getAccountTheme());
+        if (rep.getAdminTheme() != null)
+            newRealm.setAdminTheme(rep.getAdminTheme());
+        if (rep.getEmailTheme() != null)
+            newRealm.setEmailTheme(rep.getEmailTheme());
+
+        if (rep.getRequiredCredentials() != null) {
+            for (String requiredCred : rep.getRequiredCredentials()) {
+                addRequiredCredential(newRealm, requiredCred);
+            }
+        } else {
+            addRequiredCredential(newRealm, CredentialRepresentation.PASSWORD);
+        }
+
+        if (rep.getPasswordPolicy() != null)
+            newRealm.setPasswordPolicy(new PasswordPolicy(rep.getPasswordPolicy()));
+
+        importIdentityProviders(rep, newRealm);
+
+        if (rep.getApplications() != null) {
+            Map<String, ApplicationModel> appMap = createApplications(rep, newRealm);
+        }
+
+        if (rep.getRoles() != null) {
+            if (rep.getRoles().getRealm() != null) { // realm roles
+                for (RoleRepresentation roleRep : rep.getRoles().getRealm()) {
+                    createRole(newRealm, roleRep);
+                }
+            }
+            if (rep.getRoles().getApplication() != null) {
+                for (Map.Entry<String, List<RoleRepresentation>> entry : rep.getRoles().getApplication().entrySet()) {
+                    ApplicationModel app = newRealm.getApplicationByName(entry.getKey());
+                    if (app == null) {
+                        throw new RuntimeException("App doesn't exist in role definitions: " + entry.getKey());
+                    }
+                    for (RoleRepresentation roleRep : entry.getValue()) {
+                        // Application role may already exists (for example if it is defaultRole)
+                        RoleModel role = roleRep.getId() != null ? app.addRole(roleRep.getId(), roleRep.getName()) : app
+                                .addRole(roleRep.getName());
+                        role.setDescription(roleRep.getDescription());
+                    }
+                }
+            }
+            // now that all roles are created, re-iterate and set up composites
+            if (rep.getRoles().getRealm() != null) { // realm roles
+                for (RoleRepresentation roleRep : rep.getRoles().getRealm()) {
+                    RoleModel role = newRealm.getRole(roleRep.getName());
+                    addComposites(role, roleRep, newRealm);
+                }
+            }
+            if (rep.getRoles().getApplication() != null) {
+                for (Map.Entry<String, List<RoleRepresentation>> entry : rep.getRoles().getApplication().entrySet()) {
+                    ApplicationModel app = newRealm.getApplicationByName(entry.getKey());
+                    if (app == null) {
+                        throw new RuntimeException("App doesn't exist in role definitions: " + entry.getKey());
+                    }
+                    for (RoleRepresentation roleRep : entry.getValue()) {
+                        RoleModel role = app.getRole(roleRep.getName());
+                        addComposites(role, roleRep, newRealm);
+                    }
+                }
+            }
+        }
+
+        // Setup realm default roles
+        if (rep.getDefaultRoles() != null) {
+            for (String roleString : rep.getDefaultRoles()) {
+                newRealm.addDefaultRole(roleString.trim());
+            }
+        }
+        // Setup application default roles
+        if (rep.getApplications() != null) {
+            for (ApplicationRepresentation resourceRep : rep.getApplications()) {
+                if (resourceRep.getDefaultRoles() != null) {
+                    ApplicationModel appModel = newRealm.getApplicationByName(resourceRep.getName());
+                    appModel.updateDefaultRoles(resourceRep.getDefaultRoles());
+                }
+            }
+        }
+
+        if (rep.getOauthClients() != null) {
+            createOAuthClients(rep, newRealm);
+        }
+
+        // Now that all possible roles and applications are created, create scope mappings
+
+        Map<String, ApplicationModel> appMap = newRealm.getApplicationNameMap();
+
+        if (rep.getApplicationScopeMappings() != null) {
+
+            for (Map.Entry<String, List<ScopeMappingRepresentation>> entry : rep.getApplicationScopeMappings().entrySet()) {
+                ApplicationModel app = appMap.get(entry.getKey());
+                if (app == null) {
+                    throw new RuntimeException("Unable to find application role mappings for app: " + entry.getKey());
+                }
+                createApplicationScopeMappings(newRealm, app, entry.getValue());
+            }
+        }
+
+        if (rep.getScopeMappings() != null) {
+            for (ScopeMappingRepresentation scope : rep.getScopeMappings()) {
+                ClientModel client = newRealm.findClient(scope.getClient());
+                if (client == null) {
+                    throw new RuntimeException("Unknown client specification in realm scope mappings");
+                }
+                for (String roleString : scope.getRoles()) {
+                    RoleModel role = newRealm.getRole(roleString.trim());
+                    if (role == null) {
+                        role = newRealm.addRole(roleString.trim());
+                    }
+                    client.addScopeMapping(role);
+                }
+
+            }
+        }
+
+        if (rep.getSmtpServer() != null) {
+            newRealm.setSmtpConfig(new HashMap(rep.getSmtpServer()));
+        }
+
+        if (rep.getBrowserSecurityHeaders() != null) {
+            newRealm.setBrowserSecurityHeaders(rep.getBrowserSecurityHeaders());
+        } else {
+            newRealm.setBrowserSecurityHeaders(BrowserSecurityHeaders.defaultHeaders);
+        }
+
+        if (rep.getUserFederationProviders() != null) {
+            List<UserFederationProviderModel> providerModels = convertFederationProviders(rep.getUserFederationProviders());
+            newRealm.setUserFederationProviders(providerModels);
+        }
+
+        // create users and their role mappings and social mappings
+
+        if (rep.getUsers() != null) {
+            for (UserRepresentation userRep : rep.getUsers()) {
+                UserModel user = createUser(session, newRealm, userRep, appMap);
+            }
+        }
+    }
+
+    public static void updateRealm(RealmRepresentation rep, RealmModel realm) {
+        if (rep.getRealm() != null) {
+            realm.setName(rep.getRealm());
+        }
+        if (rep.isEnabled() != null)
+            realm.setEnabled(rep.isEnabled());
+        if (rep.isBruteForceProtected() != null)
+            realm.setBruteForceProtected(rep.isBruteForceProtected());
+        if (rep.getMaxFailureWaitSeconds() != null)
+            realm.setMaxFailureWaitSeconds(rep.getMaxFailureWaitSeconds());
+        if (rep.getMinimumQuickLoginWaitSeconds() != null)
+            realm.setMinimumQuickLoginWaitSeconds(rep.getMinimumQuickLoginWaitSeconds());
+        if (rep.getWaitIncrementSeconds() != null)
+            realm.setWaitIncrementSeconds(rep.getWaitIncrementSeconds());
+        if (rep.getQuickLoginCheckMilliSeconds() != null)
+            realm.setQuickLoginCheckMilliSeconds(rep.getQuickLoginCheckMilliSeconds());
+        if (rep.getMaxDeltaTimeSeconds() != null)
+            realm.setMaxDeltaTimeSeconds(rep.getMaxDeltaTimeSeconds());
+        if (rep.getFailureFactor() != null)
+            realm.setFailureFactor(rep.getFailureFactor());
+        if (rep.isPasswordCredentialGrantAllowed() != null)
+            realm.setPasswordCredentialGrantAllowed(rep.isPasswordCredentialGrantAllowed());
+        if (rep.isRegistrationAllowed() != null)
+            realm.setRegistrationAllowed(rep.isRegistrationAllowed());
+        if (rep.isRegistrationEmailAsUsername() != null)
+            realm.setRegistrationEmailAsUsername(rep.isRegistrationEmailAsUsername());
+        if (rep.isRememberMe() != null)
+            realm.setRememberMe(rep.isRememberMe());
+        if (rep.isVerifyEmail() != null)
+            realm.setVerifyEmail(rep.isVerifyEmail());
+        if (rep.isResetPasswordAllowed() != null)
+            realm.setResetPasswordAllowed(rep.isResetPasswordAllowed());
+        if (rep.getSslRequired() != null)
+            realm.setSslRequired(SslRequired.valueOf(rep.getSslRequired().toUpperCase()));
+        if (rep.getAccessCodeLifespan() != null)
+            realm.setAccessCodeLifespan(rep.getAccessCodeLifespan());
+        if (rep.getAccessCodeLifespanUserAction() != null)
+            realm.setAccessCodeLifespanUserAction(rep.getAccessCodeLifespanUserAction());
+        if (rep.getAccessCodeLifespanLogin() != null)
+            realm.setAccessCodeLifespanLogin(rep.getAccessCodeLifespanLogin());
+        if (rep.getNotBefore() != null)
+            realm.setNotBefore(rep.getNotBefore());
+        if (rep.getAccessTokenLifespan() != null)
+            realm.setAccessTokenLifespan(rep.getAccessTokenLifespan());
+        if (rep.getSsoSessionIdleTimeout() != null)
+            realm.setSsoSessionIdleTimeout(rep.getSsoSessionIdleTimeout());
+        if (rep.getSsoSessionMaxLifespan() != null)
+            realm.setSsoSessionMaxLifespan(rep.getSsoSessionMaxLifespan());
+        if (rep.getRequiredCredentials() != null) {
+            realm.updateRequiredCredentials(rep.getRequiredCredentials());
+        }
+        if (rep.getLoginTheme() != null)
+            realm.setLoginTheme(rep.getLoginTheme());
+        if (rep.getAccountTheme() != null)
+            realm.setAccountTheme(rep.getAccountTheme());
+        if (rep.getAdminTheme() != null)
+            realm.setAdminTheme(rep.getAdminTheme());
+        if (rep.getEmailTheme() != null)
+            realm.setEmailTheme(rep.getEmailTheme());
+        if (rep.isEventsEnabled() != null)
+            realm.setEventsEnabled(rep.isEventsEnabled());
+        if (rep.getEventsExpiration() != null)
+            realm.setEventsExpiration(rep.getEventsExpiration());
+        if (rep.getEventsListeners() != null)
+            realm.setEventsListeners(new HashSet<String>(rep.getEventsListeners()));
+
+        if (rep.getPasswordPolicy() != null)
+            realm.setPasswordPolicy(new PasswordPolicy(rep.getPasswordPolicy()));
+
+        if (rep.getDefaultRoles() != null) {
+            realm.updateDefaultRoles(rep.getDefaultRoles().toArray(new String[rep.getDefaultRoles().size()]));
+        }
+
+        if (rep.getSmtpServer() != null) {
+            realm.setSmtpConfig(new HashMap(rep.getSmtpServer()));
+        }
+
+        if (rep.getBrowserSecurityHeaders() != null) {
+            realm.setBrowserSecurityHeaders(rep.getBrowserSecurityHeaders());
+        }
+
+        if (rep.getUserFederationProviders() != null) {
+            List<UserFederationProviderModel> providerModels = convertFederationProviders(rep.getUserFederationProviders());
+            realm.setUserFederationProviders(providerModels);
+        }
+
+        if ("GENERATE".equals(rep.getPublicKey())) {
+            KeycloakModelUtils.generateRealmKeys(realm);
+        }
+    }
+
+    // Basic realm stuff
+
+    public static void addRequiredCredential(RealmModel newRealm, String requiredCred) {
+        newRealm.addRequiredCredential(requiredCred);
+    }
+
+    private static List<UserFederationProviderModel> convertFederationProviders(
+            List<UserFederationProviderRepresentation> providers) {
+        List<UserFederationProviderModel> result = new ArrayList<UserFederationProviderModel>();
+
+        for (UserFederationProviderRepresentation representation : providers) {
+            UserFederationProviderModel model = new UserFederationProviderModel(representation.getId(),
+                    representation.getProviderName(), representation.getConfig(), representation.getPriority(),
+                    representation.getDisplayName(), representation.getFullSyncPeriod(), representation.getChangedSyncPeriod(),
+                    representation.getLastSync());
+            result.add(model);
+        }
+        return result;
+    }
+
+    // Roles
+
+    public static void createRole(RealmModel newRealm, RoleRepresentation roleRep) {
+        RoleModel role = roleRep.getId() != null ? newRealm.addRole(roleRep.getId(), roleRep.getName()) : newRealm
+                .addRole(roleRep.getName());
+        if (roleRep.getDescription() != null)
+            role.setDescription(roleRep.getDescription());
+    }
+
+    private static void addComposites(RoleModel role, RoleRepresentation roleRep, RealmModel realm) {
+        if (roleRep.getComposites() == null)
+            return;
+        if (roleRep.getComposites().getRealm() != null) {
+            for (String roleStr : roleRep.getComposites().getRealm()) {
+                RoleModel realmRole = realm.getRole(roleStr);
+                if (realmRole == null)
+                    throw new RuntimeException("Unable to find composite realm role: " + roleStr);
+                role.addCompositeRole(realmRole);
+            }
+        }
+        if (roleRep.getComposites().getApplication() != null) {
+            for (Map.Entry<String, List<String>> entry : roleRep.getComposites().getApplication().entrySet()) {
+                ApplicationModel app = realm.getApplicationByName(entry.getKey());
+                if (app == null) {
+                    throw new RuntimeException("App doesn't exist in role definitions: " + roleRep.getName());
+                }
+                for (String roleStr : entry.getValue()) {
+                    RoleModel appRole = app.getRole(roleStr);
+                    if (appRole == null)
+                        throw new RuntimeException("Unable to find composite app role: " + roleStr);
+                    role.addCompositeRole(appRole);
+                }
+
+            }
+
+        }
+
+    }
+
+    // APPLICATIONS
+
+    private static Map<String, ApplicationModel> createApplications(RealmRepresentation rep, RealmModel realm) {
+        Map<String, ApplicationModel> appMap = new HashMap<String, ApplicationModel>();
+        for (ApplicationRepresentation resourceRep : rep.getApplications()) {
+            ApplicationModel app = createApplication(realm, resourceRep, false);
+            appMap.put(app.getName(), app);
+        }
+        return appMap;
+    }
+
+    /**
+     * Does not create scope or role mappings!
+     * 
+     * @param realm
+     * @param resourceRep
+     * @return
+     */
+    public static ApplicationModel createApplication(RealmModel realm, ApplicationRepresentation resourceRep,
+            boolean addDefaultRoles) {
+        logger.debug("************ CREATE APPLICATION: {0}" + resourceRep.getName());
+        ApplicationModel applicationModel = resourceRep.getId() != null ? realm.addApplication(resourceRep.getId(),
+                resourceRep.getName()) : realm.addApplication(resourceRep.getName());
+        if (resourceRep.isEnabled() != null)
+            applicationModel.setEnabled(resourceRep.isEnabled());
+        applicationModel.setManagementUrl(resourceRep.getAdminUrl());
+        if (resourceRep.isSurrogateAuthRequired() != null)
+            applicationModel.setSurrogateAuthRequired(resourceRep.isSurrogateAuthRequired());
+        applicationModel.setBaseUrl(resourceRep.getBaseUrl());
+        if (resourceRep.isBearerOnly() != null)
+            applicationModel.setBearerOnly(resourceRep.isBearerOnly());
+        if (resourceRep.isPublicClient() != null)
+            applicationModel.setPublicClient(resourceRep.isPublicClient());
+        if (resourceRep.isFrontchannelLogout() != null)
+            applicationModel.setFrontchannelLogout(resourceRep.isFrontchannelLogout());
+        if (resourceRep.getProtocol() != null)
+            applicationModel.setProtocol(resourceRep.getProtocol());
+        if (resourceRep.isFullScopeAllowed() != null) {
+            applicationModel.setFullScopeAllowed(resourceRep.isFullScopeAllowed());
+        } else {
+            applicationModel.setFullScopeAllowed(true);
+        }
+        if (resourceRep.getNodeReRegistrationTimeout() != null) {
+            applicationModel.setNodeReRegistrationTimeout(resourceRep.getNodeReRegistrationTimeout());
+        } else {
+            applicationModel.setNodeReRegistrationTimeout(-1);
+        }
+        applicationModel.updateApplication();
+
+        if (resourceRep.getNotBefore() != null) {
+            applicationModel.setNotBefore(resourceRep.getNotBefore());
+        }
+
+        applicationModel.setSecret(resourceRep.getSecret());
+        if (applicationModel.getSecret() == null) {
+            KeycloakModelUtils.generateSecret(applicationModel);
+        }
+
+        if (resourceRep.getAttributes() != null) {
+            for (Map.Entry<String, String> entry : resourceRep.getAttributes().entrySet()) {
+                applicationModel.setAttribute(entry.getKey(), entry.getValue());
+            }
+        }
+
+        if (resourceRep.getRedirectUris() != null) {
+            for (String redirectUri : resourceRep.getRedirectUris()) {
+                applicationModel.addRedirectUri(redirectUri);
+            }
+        }
+        if (resourceRep.getWebOrigins() != null) {
+            for (String webOrigin : resourceRep.getWebOrigins()) {
+                logger.debugv("Application: {0} webOrigin: {1}", resourceRep.getName(), webOrigin);
+                applicationModel.addWebOrigin(webOrigin);
+            }
+        } else {
+            // add origins from redirect uris
+            if (resourceRep.getRedirectUris() != null) {
+                Set<String> origins = new HashSet<String>();
+                for (String redirectUri : resourceRep.getRedirectUris()) {
+                    logger.debugv("add redirect-uri to origin: {0}", redirectUri);
+                    if (redirectUri.startsWith("http:")) {
+                        URI uri = URI.create(redirectUri);
+                        String origin = uri.getScheme() + "://" + uri.getHost();
+                        if (uri.getPort() != -1) {
+                            origin += ":" + uri.getPort();
+                        }
+                        logger.debugv("adding default application origin: {0}", origin);
+                        origins.add(origin);
+                    }
+                }
+                if (origins.size() > 0) {
+                    applicationModel.setWebOrigins(origins);
+                }
+            }
+        }
+
+        if (resourceRep.getRegisteredNodes() != null) {
+            for (Map.Entry<String, Integer> entry : resourceRep.getRegisteredNodes().entrySet()) {
+                applicationModel.registerNode(entry.getKey(), entry.getValue());
+            }
+        }
+
+        if (addDefaultRoles && resourceRep.getDefaultRoles() != null) {
+            applicationModel.updateDefaultRoles(resourceRep.getDefaultRoles());
+        }
+
+        if (resourceRep.getProtocolMappers() != null) {
+            // first, remove all default/built in mappers
+            Set<ProtocolMapperModel> mappers = applicationModel.getProtocolMappers();
+            for (ProtocolMapperModel mapper : mappers)
+                applicationModel.removeProtocolMapper(mapper);
+
+            for (ProtocolMapperRepresentation mapper : resourceRep.getProtocolMappers()) {
+                applicationModel.addProtocolMapper(toModel(mapper));
+            }
+        }
+
+        applicationModel.updateAllowedIdentityProviders(toModel(resourceRep.getIdentityProviders(), realm));
+
+        return applicationModel;
+    }
+
+    public static void updateApplication(ApplicationRepresentation rep, ApplicationModel resource) {
+        if (rep.getName() != null)
+            resource.setName(rep.getName());
+        if (rep.isEnabled() != null)
+            resource.setEnabled(rep.isEnabled());
+        if (rep.isBearerOnly() != null)
+            resource.setBearerOnly(rep.isBearerOnly());
+        if (rep.isPublicClient() != null)
+            resource.setPublicClient(rep.isPublicClient());
+        if (rep.isFullScopeAllowed() != null)
+            resource.setFullScopeAllowed(rep.isFullScopeAllowed());
+        if (rep.isFrontchannelLogout() != null)
+            resource.setFrontchannelLogout(rep.isFrontchannelLogout());
+        if (rep.getAdminUrl() != null)
+            resource.setManagementUrl(rep.getAdminUrl());
+        if (rep.getBaseUrl() != null)
+            resource.setBaseUrl(rep.getBaseUrl());
+        if (rep.isSurrogateAuthRequired() != null)
+            resource.setSurrogateAuthRequired(rep.isSurrogateAuthRequired());
+        if (rep.getNodeReRegistrationTimeout() != null)
+            resource.setNodeReRegistrationTimeout(rep.getNodeReRegistrationTimeout());
+        resource.updateApplication();
+
+        if (rep.getProtocol() != null)
+            resource.setProtocol(rep.getProtocol());
+        if (rep.getAttributes() != null) {
+            for (Map.Entry<String, String> entry : rep.getAttributes().entrySet()) {
+                resource.setAttribute(entry.getKey(), entry.getValue());
+            }
+        }
+
+        if (rep.getNotBefore() != null) {
+            resource.setNotBefore(rep.getNotBefore());
+        }
+        if (rep.getDefaultRoles() != null) {
+            resource.updateDefaultRoles(rep.getDefaultRoles());
+        }
+
+        List<String> redirectUris = rep.getRedirectUris();
+        if (redirectUris != null) {
+            resource.setRedirectUris(new HashSet<String>(redirectUris));
+        }
+
+        List<String> webOrigins = rep.getWebOrigins();
+        if (webOrigins != null) {
+            resource.setWebOrigins(new HashSet<String>(webOrigins));
+        }
+
+        if (rep.getRegisteredNodes() != null) {
+            for (Map.Entry<String, Integer> entry : rep.getRegisteredNodes().entrySet()) {
+                resource.registerNode(entry.getKey(), entry.getValue());
+            }
+        }
+
+        updateClientIdentityProvides(rep.getIdentityProviders(), resource);
+    }
+
+    public static void setClaims(ClientModel model, ClaimRepresentation rep) {
+        long mask = model.getAllowedClaimsMask();
+        if (rep.getAddress()) {
+            mask |= ClaimMask.ADDRESS;
+        } else {
+            mask &= ~ClaimMask.ADDRESS;
+        }
+        if (rep.getEmail()) {
+            mask |= ClaimMask.EMAIL;
+        } else {
+            mask &= ~ClaimMask.EMAIL;
+        }
+        if (rep.getGender()) {
+            mask |= ClaimMask.GENDER;
+        } else {
+            mask &= ~ClaimMask.GENDER;
+        }
+        if (rep.getLocale()) {
+            mask |= ClaimMask.LOCALE;
+        } else {
+            mask &= ~ClaimMask.LOCALE;
+        }
+        if (rep.getName()) {
+            mask |= ClaimMask.NAME;
+        } else {
+            mask &= ~ClaimMask.NAME;
+        }
+        if (rep.getPhone()) {
+            mask |= ClaimMask.PHONE;
+        } else {
+            mask &= ~ClaimMask.PHONE;
+        }
+        if (rep.getPicture()) {
+            mask |= ClaimMask.PICTURE;
+        } else {
+            mask &= ~ClaimMask.PICTURE;
+        }
+        if (rep.getProfile()) {
+            mask |= ClaimMask.PROFILE;
+        } else {
+            mask &= ~ClaimMask.PROFILE;
+        }
+        if (rep.getUsername()) {
+            mask |= ClaimMask.USERNAME;
+        } else {
+            mask &= ~ClaimMask.USERNAME;
+        }
+        if (rep.getWebsite()) {
+            mask |= ClaimMask.WEBSITE;
+        } else {
+            mask &= ~ClaimMask.WEBSITE;
+        }
+        model.setAllowedClaimsMask(mask);
+    }
+
+    // OAuth clients
+
+    private static void createOAuthClients(RealmRepresentation realmRep, RealmModel realm) {
+        for (OAuthClientRepresentation rep : realmRep.getOauthClients()) {
+            createOAuthClient(rep, realm);
+        }
+    }
+
+    public static OAuthClientModel createOAuthClient(String id, String name, RealmModel realm) {
+        OAuthClientModel model = id != null ? realm.addOAuthClient(id, name) : realm.addOAuthClient(name);
+        KeycloakModelUtils.generateSecret(model);
+        return model;
+    }
+
+    public static OAuthClientModel createOAuthClient(OAuthClientRepresentation rep, RealmModel realm) {
+        OAuthClientModel model = createOAuthClient(rep.getId(), rep.getName(), realm);
+
+        model.updateAllowedIdentityProviders(toModel(rep.getIdentityProviders(), realm));
+
+        updateOAuthClient(rep, model);
+        return model;
+    }
+
+    public static void updateOAuthClient(OAuthClientRepresentation rep, OAuthClientModel model) {
+        if (rep.getName() != null)
+            model.setClientId(rep.getName());
+        if (rep.isEnabled() != null)
+            model.setEnabled(rep.isEnabled());
+        if (rep.isPublicClient() != null)
+            model.setPublicClient(rep.isPublicClient());
+        if (rep.isFrontchannelLogout() != null)
+            model.setFrontchannelLogout(rep.isFrontchannelLogout());
+        if (rep.isFullScopeAllowed() != null)
+            model.setFullScopeAllowed(rep.isFullScopeAllowed());
+        if (rep.isDirectGrantsOnly() != null)
+            model.setDirectGrantsOnly(rep.isDirectGrantsOnly());
+        if (rep.getClaims() != null) {
+            setClaims(model, rep.getClaims());
+        }
+        if (rep.getNotBefore() != null) {
+            model.setNotBefore(rep.getNotBefore());
+        }
+        if (rep.getSecret() != null)
+            model.setSecret(rep.getSecret());
+        List<String> redirectUris = rep.getRedirectUris();
+        if (redirectUris != null) {
+            model.setRedirectUris(new HashSet<String>(redirectUris));
+        }
+
+        List<String> webOrigins = rep.getWebOrigins();
+        if (webOrigins != null) {
+            model.setWebOrigins(new HashSet<String>(webOrigins));
+        }
+
+        if (rep.getNotBefore() != null) {
+            model.setNotBefore(rep.getNotBefore());
+        }
+        if (rep.getProtocol() != null)
+            model.setProtocol(rep.getProtocol());
+        if (rep.getAttributes() != null) {
+            for (Map.Entry<String, String> entry : rep.getAttributes().entrySet()) {
+                model.setAttribute(entry.getKey(), entry.getValue());
+            }
+        }
+
+        updateClientIdentityProvides(rep.getIdentityProviders(), model);
+
+        if (rep.getProtocolMappers() != null) {
+            // first, remove all default/built in mappers
+            Set<ProtocolMapperModel> mappers = model.getProtocolMappers();
+            for (ProtocolMapperModel mapper : mappers)
+                model.removeProtocolMapper(mapper);
+
+            for (ProtocolMapperRepresentation mapper : rep.getProtocolMappers()) {
+                model.addProtocolMapper(toModel(mapper));
+            }
+        }
+
+    }
+
+    // Scope mappings
+
+    public static void createApplicationScopeMappings(RealmModel realm, ApplicationModel applicationModel,
+            List<ScopeMappingRepresentation> mappings) {
+        for (ScopeMappingRepresentation mapping : mappings) {
+            ClientModel client = realm.findClient(mapping.getClient());
+            if (client == null) {
+                throw new RuntimeException("Unknown client specified in application scope mappings");
+            }
+            for (String roleString : mapping.getRoles()) {
+                RoleModel role = applicationModel.getRole(roleString.trim());
+                if (role == null) {
+                    role = applicationModel.addRole(roleString.trim());
+                }
+                client.addScopeMapping(role);
+            }
+        }
+    }
+
+    // Users
+
+    public static UserModel createUser(KeycloakSession session, RealmModel newRealm, UserRepresentation userRep,
+            Map<String, ApplicationModel> appMap) {
+        // Import users just to user storage. Don't federate
+        UserModel user = session.userStorage().addUser(newRealm, userRep.getId(), userRep.getUsername(), false);
+        user.setEnabled(userRep.isEnabled());
+        user.setEmail(userRep.getEmail());
+        user.setFirstName(userRep.getFirstName());
+        user.setLastName(userRep.getLastName());
+        user.setFederationLink(userRep.getFederationLink());
+        user.setTotp(userRep.isTotp());
+        if (userRep.getAttributes() != null) {
+            for (Map.Entry<String, String> entry : userRep.getAttributes().entrySet()) {
+                user.setAttribute(entry.getKey(), entry.getValue());
+            }
+        }
+        if (userRep.getRequiredActions() != null) {
+            for (String requiredAction : userRep.getRequiredActions()) {
+                user.addRequiredAction(UserModel.RequiredAction.valueOf(requiredAction));
+            }
+        }
+        if (userRep.getCredentials() != null) {
+            for (CredentialRepresentation cred : userRep.getCredentials()) {
+                updateCredential(user, cred);
+            }
+        }
+        if (userRep.getFederatedIdentities() != null) {
+            for (FederatedIdentityRepresentation identity : userRep.getFederatedIdentities()) {
+                FederatedIdentityModel mappingModel = new FederatedIdentityModel(identity.getIdentityProvider(),
+                        identity.getUserId(), identity.getUserName());
+                session.users().addFederatedIdentity(newRealm, user, mappingModel);
+            }
+        }
+        if (userRep.getRealmRoles() != null) {
+            for (String roleString : userRep.getRealmRoles()) {
+                RoleModel role = newRealm.getRole(roleString.trim());
+                if (role == null) {
+                    role = newRealm.addRole(roleString.trim());
+                }
+                user.grantRole(role);
+            }
+        }
+        if (userRep.getApplicationRoles() != null) {
+            for (Map.Entry<String, List<String>> entry : userRep.getApplicationRoles().entrySet()) {
+                ApplicationModel app = appMap.get(entry.getKey());
+                if (app == null) {
+                    throw new RuntimeException("Unable to find application role mappings for app: " + entry.getKey());
+                }
+                createApplicationRoleMappings(app, user, entry.getValue());
+            }
+        }
+        return user;
+    }
+
+    // Detect if it is "plain-text" or "hashed" representation and update model according to it
+    private static void updateCredential(UserModel user, CredentialRepresentation cred) {
+        if (cred.getValue() != null) {
+            UserCredentialModel plainTextCred = convertCredential(cred);
+            user.updateCredential(plainTextCred);
+        } else {
+            UserCredentialValueModel hashedCred = new UserCredentialValueModel();
+            hashedCred.setType(cred.getType());
+            hashedCred.setDevice(cred.getDevice());
+            hashedCred.setHashIterations(cred.getHashIterations());
+            try {
+                if (cred.getSalt() != null)
+                    hashedCred.setSalt(Base64.decode(cred.getSalt()));
+            } catch (IOException ioe) {
+                throw new RuntimeException(ioe);
+            }
+            hashedCred.setValue(cred.getHashedSaltedValue());
+            user.updateCredentialDirectly(hashedCred);
+        }
+    }
+
+    public static UserCredentialModel convertCredential(CredentialRepresentation cred) {
+        UserCredentialModel credential = new UserCredentialModel();
+        credential.setType(cred.getType());
+        credential.setValue(cred.getValue());
+        return credential;
+    }
+
+    // Role mappings
+
+    public static void createApplicationRoleMappings(ApplicationModel applicationModel, UserModel user,
+            List<String> roleNames) {
+        if (user == null) {
+            throw new RuntimeException("User not found");
+        }
+
+        for (String roleName : roleNames) {
+            RoleModel role = applicationModel.getRole(roleName.trim());
+            if (role == null) {
+                role = applicationModel.addRole(roleName.trim());
+            }
+            user.grantRole(role);
+
+        }
+    }
+
+    private static void importIdentityProviders(RealmRepresentation rep, RealmModel newRealm) {
+        if (rep.getIdentityProviders() != null) {
+            for (IdentityProviderRepresentation representation : rep.getIdentityProviders()) {
+                newRealm.addIdentityProvider(toModel(representation));
+            }
+        }
+    }
+
+    public static IdentityProviderModel toModel(IdentityProviderRepresentation representation) {
+        IdentityProviderModel identityProviderModel = new IdentityProviderModel();
+
+        identityProviderModel.setInternalId(representation.getInternalId());
+        identityProviderModel.setId(representation.getId());
+        identityProviderModel.setProviderId(representation.getProviderId());
+        identityProviderModel.setName(representation.getName());
+        identityProviderModel.setEnabled(representation.isEnabled());
+        identityProviderModel.setUpdateProfileFirstLogin(representation.isUpdateProfileFirstLogin());
+        identityProviderModel.setAuthenticateByDefault(representation.isAuthenticateByDefault());
+        identityProviderModel.setStoreToken(representation.isStoreToken());
+        identityProviderModel.setConfig(representation.getConfig());
+
+        return identityProviderModel;
+    }
+
+    public static ProtocolMapperModel toModel(ProtocolMapperRepresentation rep) {
+        ProtocolMapperModel model = new ProtocolMapperModel();
+        model.setId(rep.getId());
+        model.setName(rep.getName());
+        model.setConsentRequired(rep.isConsentRequired());
+        model.setConsentText(rep.getConsentText());
+        model.setProtocol(rep.getProtocol());
+        model.setProtocolMapper(rep.getProtocolMapper());
+        model.setConfig(rep.getConfig());
+        return model;
+    }
+
+    private static List<ClientIdentityProviderMappingModel> toModel(
+            List<ClientIdentityProviderMappingRepresentation> repIdentityProviders, RealmModel realm) {
+        List<ClientIdentityProviderMappingModel> allowedIdentityProviders = new ArrayList<ClientIdentityProviderMappingModel>();
+
+        if (repIdentityProviders == null || repIdentityProviders.isEmpty()) {
+            allowedIdentityProviders = new ArrayList<ClientIdentityProviderMappingModel>();
+
+            for (IdentityProviderModel identityProvider : realm.getIdentityProviders()) {
+                ClientIdentityProviderMappingModel identityProviderMapping = new ClientIdentityProviderMappingModel();
+
+                identityProviderMapping.setIdentityProvider(identityProvider.getId());
+
+                allowedIdentityProviders.add(identityProviderMapping);
+            }
+        } else {
+            for (ClientIdentityProviderMappingRepresentation rep : repIdentityProviders) {
+                ClientIdentityProviderMappingModel identityProviderMapping = new ClientIdentityProviderMappingModel();
+
+                identityProviderMapping.setIdentityProvider(rep.getId());
+                identityProviderMapping.setRetrieveToken(rep.isRetrieveToken());
+
+                allowedIdentityProviders.add(identityProviderMapping);
+            }
+        }
+
+        return allowedIdentityProviders;
+    }
+
+    private static void updateClientIdentityProvides(List<ClientIdentityProviderMappingRepresentation> identityProviders,
+            ClientModel resource) {
+        if (identityProviders != null) {
+            List<ClientIdentityProviderMappingModel> allowedIdentityProviders = new ArrayList<ClientIdentityProviderMappingModel>();
+
+            for (ClientIdentityProviderMappingRepresentation mappingRepresentation : identityProviders) {
+                ClientIdentityProviderMappingModel identityProviderMapping = new ClientIdentityProviderMappingModel();
+
+                identityProviderMapping.setIdentityProvider(mappingRepresentation.getId());
+                identityProviderMapping.setRetrieveToken(mappingRepresentation.isRetrieveToken());
+
+                allowedIdentityProviders.add(identityProviderMapping);
+            }
+
+            resource.updateAllowedIdentityProviders(allowedIdentityProviders);
+        }
+    }
 }
diff --git a/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java b/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java
index 1151b32..0e08e88 100755
--- a/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java
+++ b/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java
@@ -62,1060 +62,1060 @@ import org.keycloak.models.utils.KeycloakModelUtils;
  */
 public class RealmAdapter implements RealmModel {
 
-	private final InMemoryModel inMemoryModel;
-	private final RealmEntity realm;
-
-	protected volatile transient PublicKey publicKey;
-	protected volatile transient PrivateKey privateKey;
-	protected volatile transient X509Certificate certificate;
-	protected volatile transient Key codeSecretKey;
-
-	private volatile transient PasswordPolicy passwordPolicy;
-	private volatile transient KeycloakSession session;
-
-	private final Map<String, ApplicationModel> allApps = new HashMap<String, ApplicationModel>();
-	private ApplicationModel masterAdminApp = null;
-	private final Map<String, RoleAdapter> allRoles = new HashMap<String, RoleAdapter>();
-	private final Map<String, OAuthClientAdapter> allOAuthClients = new HashMap<String, OAuthClientAdapter>();
-	private final Map<String, IdentityProviderModel> allIdProviders = new HashMap<String, IdentityProviderModel>();
-
-	public RealmAdapter(KeycloakSession session, RealmEntity realm, InMemoryModel inMemoryModel) {
-		this.session = session;
-		this.realm = realm;
-		this.inMemoryModel = inMemoryModel;
-	}
-
-	public RealmEntity getRealmEnity() {
-		return realm;
-	}
-
-	@Override
-	public String getId() {
-		return realm.getId();
-	}
-
-	@Override
-	public String getName() {
-		return realm.getName();
-	}
-
-	@Override
-	public void setName(String name) {
-		if (getName() == null) {
-			realm.setName(name);
-			return;
-		}
-
-		if (getName().equals(name))
-			return; // allow setting name to same value
-
-		if (inMemoryModel.getRealmByName(name) != null)
-			throw new ModelDuplicateException("Realm " + name + " already exists.");
-		realm.setName(name);
-	}
-
-	@Override
-	public boolean isEnabled() {
-		return realm.isEnabled();
-	}
-
-	@Override
-	public void setEnabled(boolean enabled) {
-		realm.setEnabled(enabled);
-	}
-
-	@Override
-	public SslRequired getSslRequired() {
-		return SslRequired.valueOf(realm.getSslRequired());
-	}
-
-	@Override
-	public void setSslRequired(SslRequired sslRequired) {
-		realm.setSslRequired(sslRequired.name());
-	}
-
-	@Override
-	public boolean isPasswordCredentialGrantAllowed() {
-		return realm.isPasswordCredentialGrantAllowed();
-	}
-
-	@Override
-	public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
-		realm.setPasswordCredentialGrantAllowed(passwordCredentialGrantAllowed);
-	}
-
-	@Override
-	public boolean isRegistrationAllowed() {
-		return realm.isRegistrationAllowed();
-	}
-
-	@Override
-	public void setRegistrationAllowed(boolean registrationAllowed) {
-		realm.setRegistrationAllowed(registrationAllowed);
-	}
-
-	@Override
-	public boolean isRegistrationEmailAsUsername() {
-		return realm.isRegistrationEmailAsUsername();
-	}
-
-	@Override
-	public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
-		realm.setRegistrationEmailAsUsername(registrationEmailAsUsername);
-	}
-
-	@Override
-	public boolean isRememberMe() {
-		return realm.isRememberMe();
-	}
-
-	@Override
-	public void setRememberMe(boolean rememberMe) {
-		realm.setRememberMe(rememberMe);
-	}
-
-	@Override
-	public boolean isBruteForceProtected() {
-		return realm.isBruteForceProtected();
-	}
-
-	@Override
-	public void setBruteForceProtected(boolean value) {
-		realm.setBruteForceProtected(value);
-	}
-
-	@Override
-	public int getMaxFailureWaitSeconds() {
-		return realm.getMaxFailureWaitSeconds();
-	}
-
-	@Override
-	public void setMaxFailureWaitSeconds(int val) {
-		realm.setMaxFailureWaitSeconds(val);
-	}
-
-	@Override
-	public int getWaitIncrementSeconds() {
-		return realm.getWaitIncrementSeconds();
-	}
-
-	@Override
-	public void setWaitIncrementSeconds(int val) {
-		realm.setWaitIncrementSeconds(val);
-	}
-
-	@Override
-	public long getQuickLoginCheckMilliSeconds() {
-		return realm.getQuickLoginCheckMilliSeconds();
-	}
-
-	@Override
-	public void setQuickLoginCheckMilliSeconds(long val) {
-		realm.setQuickLoginCheckMilliSeconds(val);
-	}
-
-	@Override
-	public int getMinimumQuickLoginWaitSeconds() {
-		return realm.getMinimumQuickLoginWaitSeconds();
-	}
-
-	@Override
-	public void setMinimumQuickLoginWaitSeconds(int val) {
-		realm.setMinimumQuickLoginWaitSeconds(val);
-	}
-
-	@Override
-	public int getMaxDeltaTimeSeconds() {
-		return realm.getMaxDeltaTimeSeconds();
-	}
-
-	@Override
-	public void setMaxDeltaTimeSeconds(int val) {
-		realm.setMaxDeltaTimeSeconds(val);
-	}
-
-	@Override
-	public int getFailureFactor() {
-		return realm.getFailureFactor();
-	}
-
-	@Override
-	public void setFailureFactor(int failureFactor) {
-		realm.setFailureFactor(failureFactor);
-	}
-
-	@Override
-	public boolean isVerifyEmail() {
-		return realm.isVerifyEmail();
-	}
-
-	@Override
-	public void setVerifyEmail(boolean verifyEmail) {
-		realm.setVerifyEmail(verifyEmail);
-	}
-
-	@Override
-	public boolean isResetPasswordAllowed() {
-		return realm.isResetPasswordAllowed();
-	}
-
-	@Override
-	public void setResetPasswordAllowed(boolean resetPassword) {
-		realm.setResetPasswordAllowed(resetPassword);
-	}
-
-	@Override
-	public PasswordPolicy getPasswordPolicy() {
-		if (passwordPolicy == null) {
-			passwordPolicy = new PasswordPolicy(realm.getPasswordPolicy());
-		}
-		return passwordPolicy;
-	}
-
-	@Override
-	public void setPasswordPolicy(PasswordPolicy policy) {
-		this.passwordPolicy = policy;
-		realm.setPasswordPolicy(policy.toString());
-	}
-
-	@Override
-	public int getNotBefore() {
-		return realm.getNotBefore();
-	}
-
-	@Override
-	public void setNotBefore(int notBefore) {
-		realm.setNotBefore(notBefore);
-	}
-
-	@Override
-	public int getSsoSessionIdleTimeout() {
-		return realm.getSsoSessionIdleTimeout();
-	}
-
-	@Override
-	public void setSsoSessionIdleTimeout(int seconds) {
-		realm.setSsoSessionIdleTimeout(seconds);
-	}
-
-	@Override
-	public int getSsoSessionMaxLifespan() {
-		return realm.getSsoSessionMaxLifespan();
-	}
-
-	@Override
-	public void setSsoSessionMaxLifespan(int seconds) {
-		realm.setSsoSessionMaxLifespan(seconds);
-	}
-
-	@Override
-	public int getAccessTokenLifespan() {
-		return realm.getAccessTokenLifespan();
-	}
-
-	@Override
-	public void setAccessTokenLifespan(int tokenLifespan) {
-		realm.setAccessTokenLifespan(tokenLifespan);
-	}
-
-	@Override
-	public int getAccessCodeLifespan() {
-		return realm.getAccessCodeLifespan();
-	}
-
-	@Override
-	public void setAccessCodeLifespan(int accessCodeLifespan) {
-		realm.setAccessCodeLifespan(accessCodeLifespan);
-	}
-
-	@Override
-	public int getAccessCodeLifespanUserAction() {
-		return realm.getAccessCodeLifespanUserAction();
-	}
-
-	@Override
-	public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
-		realm.setAccessCodeLifespanUserAction(accessCodeLifespanUserAction);
-	}
-
-	@Override
-	public String getPublicKeyPem() {
-		return realm.getPublicKeyPem();
-	}
-
-	@Override
-	public void setPublicKeyPem(String publicKeyPem) {
-		realm.setPublicKeyPem(publicKeyPem);
-		this.publicKey = null;
-	}
-
-	@Override
-	public X509Certificate getCertificate() {
-		if (certificate != null)
-			return certificate;
-		certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
-		return certificate;
-	}
-
-	@Override
-	public void setCertificate(X509Certificate certificate) {
-		this.certificate = certificate;
-		String certificatePem = KeycloakModelUtils.getPemFromCertificate(certificate);
-		setCertificatePem(certificatePem);
-	}
-
-	@Override
-	public String getCertificatePem() {
-		return realm.getCertificatePem();
-	}
-
-	@Override
-	public void setCertificatePem(String certificate) {
-		realm.setCertificatePem(certificate);
-
-	}
-
-	@Override
-	public String getPrivateKeyPem() {
-		return realm.getPrivateKeyPem();
-	}
-
-	@Override
-	public void setPrivateKeyPem(String privateKeyPem) {
-		realm.setPrivateKeyPem(privateKeyPem);
-		this.privateKey = null;
-	}
-
-	@Override
-	public PublicKey getPublicKey() {
-		if (publicKey != null)
-			return publicKey;
-		publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
-		return publicKey;
-	}
-
-	@Override
-	public void setPublicKey(PublicKey publicKey) {
-		this.publicKey = publicKey;
-		String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
-		setPublicKeyPem(publicKeyPem);
-	}
-
-	@Override
-	public PrivateKey getPrivateKey() {
-		if (privateKey != null)
-			return privateKey;
-		privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
-		return privateKey;
-	}
-
-	@Override
-	public void setPrivateKey(PrivateKey privateKey) {
-		this.privateKey = privateKey;
-		String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
-		setPrivateKeyPem(privateKeyPem);
-	}
-
-	@Override
-	public String getCodeSecret() {
-		return realm.getCodeSecret();
-	}
-
-	@Override
-	public Key getCodeSecretKey() {
-		if (codeSecretKey == null) {
-			codeSecretKey = KeycloakModelUtils.getSecretKey(getCodeSecret());
-		}
-		return codeSecretKey;
-	}
-
-	@Override
-	public void setCodeSecret(String codeSecret) {
-		realm.setCodeSecret(codeSecret);
-	}
-
-	@Override
-	public String getLoginTheme() {
-		return realm.getLoginTheme();
-	}
-
-	@Override
-	public void setLoginTheme(String name) {
-		realm.setLoginTheme(name);
-	}
-
-	@Override
-	public String getAccountTheme() {
-		return realm.getAccountTheme();
-	}
-
-	@Override
-	public void setAccountTheme(String name) {
-		realm.setAccountTheme(name);
-	}
-
-	@Override
-	public String getAdminTheme() {
-		return realm.getAdminTheme();
-	}
-
-	@Override
-	public void setAdminTheme(String name) {
-		realm.setAdminTheme(name);
-	}
-
-	@Override
-	public String getEmailTheme() {
-		return realm.getEmailTheme();
-	}
-
-	@Override
-	public void setEmailTheme(String name) {
-		realm.setEmailTheme(name);
-	}
-
-	@Override
-	public RoleAdapter getRole(String name) {
-		for (RoleAdapter role : allRoles.values()) {
-			if (role.getName().equals(name))
-				return role;
-		}
-		return null;
-	}
-
-	@Override
-	public RoleModel addRole(String name) {
-		return this.addRole(KeycloakModelUtils.generateId(), name);
-	}
-
-	@Override
-	public RoleModel addRole(String id, String name) {
-		if (id == null)
-			throw new NullPointerException("id == null");
-		if (name == null)
-			throw new NullPointerException("name == null");
-		if (hasRoleWithName(name))
-			throw new ModelDuplicateException("Realm already contains role with name " + name + ".");
-
-		RoleEntity roleEntity = new RoleEntity();
-		roleEntity.setId(id);
-		roleEntity.setName(name);
-		roleEntity.setRealmId(getId());
-
-		RoleAdapter roleModel = new RoleAdapter(this, roleEntity, this);
-		allRoles.put(id, roleModel);
-		return roleModel;
-	}
-
-	@Override
-	public boolean removeRole(RoleModel role) {
-		return removeRoleById(role.getId());
-	}
-
-	@Override
-	public boolean removeRoleById(String id) {
-		if (id == null)
-			throw new NullPointerException("id == null");
-
-		// try realm roles first
-		if (allRoles.remove(id) != null)
-			return true;
-
-		for (ApplicationModel app : getApplications()) {
-			for (RoleModel appRole : app.getRoles()) {
-				if (id.equals(appRole.getId())) {
-					app.removeRole(appRole);
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	@Override
-	public Set<RoleModel> getRoles() {
-		return new HashSet<RoleModel>(allRoles.values());
-	}
-
-	@Override
-	public RoleModel getRoleById(String id) {
-		RoleModel found = allRoles.get(id);
-		if (found != null)
-			return found;
-
-		for (ApplicationModel app : getApplications()) {
-			for (RoleModel appRole : app.getRoles()) {
-				if (appRole.getId().equals(id))
-					return appRole;
-			}
-		}
-
-		return null;
-	}
-
-	@Override
-	public List<String> getDefaultRoles() {
-		return realm.getDefaultRoles();
-	}
-
-	@Override
-	public void addDefaultRole(String name) {
-		RoleModel role = getRole(name);
-		if (role == null) {
-			addRole(name);
-		}
-
-		List<String> roleNames = getDefaultRoles();
-		if (roleNames.contains(name))
-			throw new IllegalArgumentException("Realm " + realm.getName() + " already contains default role named " + name);
-
-		roleNames.add(name);
-		realm.setDefaultRoles(roleNames);
-	}
-
-	boolean hasRoleWithName(String name) {
-		for (RoleModel role : allRoles.values()) {
-			if (role.getName().equals(name))
-				return true;
-		}
-
-		return false;
-	}
-
-	@Override
-	public void updateDefaultRoles(String[] defaultRoles) {
-		List<String> roleNames = new ArrayList<String>();
-		for (String roleName : defaultRoles) {
-			RoleModel role = getRole(roleName);
-			if (role == null) {
-				addRole(roleName);
-			}
-
-			roleNames.add(roleName);
-		}
-
-		realm.setDefaultRoles(roleNames);
-	}
-
-	@Override
-	public ClientModel findClient(String clientId) {
-		ClientModel model = getApplicationByName(clientId);
-		if (model != null)
-			return model;
-		return getOAuthClient(clientId);
-	}
-
-	@Override
-	public ClientModel findClientById(String id) {
-		ClientModel clientModel = getApplicationById(id);
-		if (clientModel != null)
-			return clientModel;
-		return getOAuthClientById(id);
-	}
-
-	@Override
-	public ApplicationModel getApplicationById(String id) {
-		return allApps.get(id);
-	}
-
-	@Override
-	public ApplicationModel getApplicationByName(String name) {
-		for (ApplicationModel app : getApplications()) {
-			if (app.getName().equals(name))
-				return app;
-		}
-
-		return null;
-	}
-
-	@Override
-	public Map<String, ApplicationModel> getApplicationNameMap() {
-		Map<String, ApplicationModel> resourceMap = new HashMap<String, ApplicationModel>();
-		for (ApplicationModel resource : getApplications()) {
-			resourceMap.put(resource.getName(), resource);
-		}
-		return resourceMap;
-	}
-
-	@Override
-	public List<ApplicationModel> getApplications() {
-		return new ArrayList<ApplicationModel>(allApps.values());
-	}
-
-	@Override
-	public ApplicationModel addApplication(String name) {
-		return this.addApplication(KeycloakModelUtils.generateId(), name);
-	}
-
-	@Override
-	public ApplicationModel addApplication(String id, String name) {
-		if (name == null)
-			throw new NullPointerException("name == null");
-		if (id == null)
-			throw new NullPointerException("id == null");
-
-		if (getApplicationNameMap().containsKey(name)) {
-			throw new ModelDuplicateException("Application named '" + name + "' already exists.");
-		}
-
-		ApplicationEntity appEntity = new ApplicationEntity();
-		appEntity.setId(id);
-		appEntity.setName(name);
-		appEntity.setRealmId(getId());
-		appEntity.setEnabled(true);
-
-		ClientEntity clientEntity = new ClientEntity();
-		clientEntity.setId(id);
-		clientEntity.setName(name);
-		clientEntity.setRealmId(getId());
-		clientEntity.setEnabled(true);
-
-		final ApplicationModel app = new ApplicationAdapter(session, this, appEntity, clientEntity, inMemoryModel);
-		session.getKeycloakSessionFactory().publish(new ApplicationCreationEvent() {
-			@Override
-			public ApplicationModel getCreatedApplication() {
-				return app;
-			}
-
-			@Override
-			public ClientModel getCreatedClient() {
-				return app;
-			}
-		});
-
-		allApps.put(id, app);
-
-		return app;
-	}
-
-	@Override
-	public boolean removeApplication(String id) {
-		ApplicationModel appToBeRemoved = this.getApplicationById(id);
-		if (appToBeRemoved == null)
-			return false;
-
-		// remove any composite role assignments for this app
-		for (RoleModel role : this.getRoles()) {
-			RoleAdapter roleAdapter = (RoleAdapter) role;
-			roleAdapter.removeApplicationComposites(id);
-		}
-
-		for (RoleModel role : appToBeRemoved.getRoles()) {
-			appToBeRemoved.removeRole(role);
-		}
-
-		return (allApps.remove(id) != null);
-	}
-
-	@Override
-	public OAuthClientModel addOAuthClient(String name) {
-		return this.addOAuthClient(KeycloakModelUtils.generateId(), name);
-	}
-
-	@Override
-	public OAuthClientModel addOAuthClient(String id, String name) {
-		if (id == null)
-			throw new NullPointerException("id == null");
-		if (name == null)
-			throw new NullPointerException("name == null");
-		if (hasOAuthClientWithName(name))
-			throw new ModelDuplicateException("OAuth Client with name " + name + " already exists.");
-		OAuthClientEntity oauthClient = new OAuthClientEntity();
-		oauthClient.setId(id);
-		oauthClient.setRealmId(getId());
-		oauthClient.setName(name);
-
-		OAuthClientAdapter oAuthClient = new OAuthClientAdapter(session, this, oauthClient);
-		allOAuthClients.put(id, oAuthClient);
-
-		return oAuthClient;
-	}
-
-	boolean hasOAuthClientWithName(String name) {
-		for (OAuthClientAdapter oaClient : allOAuthClients.values()) {
-			if (oaClient.getName().equals(name))
-				return true;
-		}
-
-		return false;
-	}
-
-	boolean hasOAuthClientWithClientId(String id) {
-		for (OAuthClientAdapter oaClient : allOAuthClients.values()) {
-			if (oaClient.getClientId().equals(id))
-				return true;
-		}
-
-		return false;
-	}
-
-	boolean hasUserWithEmail(String email) {
-		for (UserModel user : inMemoryModel.getUsers(getId())) {
-			if (user.getEmail() == null)
-				continue;
-			if (user.getEmail().equals(email))
-				return true;
-		}
-
-		return false;
-	}
-
-	@Override
-	public boolean removeOAuthClient(String id) {
-		return allOAuthClients.remove(id) != null;
-	}
-
-	@Override
-	public OAuthClientModel getOAuthClient(String name) {
-		for (OAuthClientAdapter oAuthClient : allOAuthClients.values()) {
-			if (oAuthClient.getName().equals(name))
-				return oAuthClient;
-		}
-
-		return null;
-	}
-
-	@Override
-	public OAuthClientModel getOAuthClientById(String id) {
-		for (OAuthClientAdapter oAuthClient : allOAuthClients.values()) {
-			if (oAuthClient.getId().equals(id))
-				return oAuthClient;
-		}
-
-		return null;
-	}
-
-	@Override
-	public List<OAuthClientModel> getOAuthClients() {
-		return new ArrayList<OAuthClientModel>(allOAuthClients.values());
-	}
-
-	@Override
-	public void addRequiredCredential(String type) {
-		RequiredCredentialModel credentialModel = initRequiredCredentialModel(type);
-		addRequiredCredential(credentialModel, realm.getRequiredCredentials());
-	}
-
-	protected void addRequiredCredential(RequiredCredentialModel credentialModel,
-			List<RequiredCredentialEntity> persistentCollection) {
-		RequiredCredentialEntity credEntity = new RequiredCredentialEntity();
-		credEntity.setType(credentialModel.getType());
-		credEntity.setFormLabel(credentialModel.getFormLabel());
-		credEntity.setInput(credentialModel.isInput());
-		credEntity.setSecret(credentialModel.isSecret());
-
-		persistentCollection.add(credEntity);
-	}
-
-	@Override
-	public void updateRequiredCredentials(Set<String> creds) {
-		updateRequiredCredentials(creds, realm.getRequiredCredentials());
-	}
-
-	protected void updateRequiredCredentials(Set<String> creds, List<RequiredCredentialEntity> credsEntities) {
-		Set<String> already = new HashSet<String>();
-		Set<RequiredCredentialEntity> toRemove = new HashSet<RequiredCredentialEntity>();
-		for (RequiredCredentialEntity entity : credsEntities) {
-			if (!creds.contains(entity.getType())) {
-				toRemove.add(entity);
-			} else {
-				already.add(entity.getType());
-			}
-		}
-		for (RequiredCredentialEntity entity : toRemove) {
-			credsEntities.remove(entity);
-		}
-		for (String cred : creds) {
-			if (!already.contains(cred)) {
-				RequiredCredentialModel credentialModel = initRequiredCredentialModel(cred);
-				addRequiredCredential(credentialModel, credsEntities);
-			}
-		}
-	}
-
-	@Override
-	public List<RequiredCredentialModel> getRequiredCredentials() {
-		return convertRequiredCredentialEntities(realm.getRequiredCredentials());
-	}
-
-	protected List<RequiredCredentialModel> convertRequiredCredentialEntities(
-			Collection<RequiredCredentialEntity> credEntities) {
-
-		List<RequiredCredentialModel> result = new ArrayList<RequiredCredentialModel>();
-		for (RequiredCredentialEntity entity : credEntities) {
-			RequiredCredentialModel credentialModel = new RequiredCredentialModel();
-			credentialModel.setFormLabel(entity.getFormLabel());
-			credentialModel.setInput(entity.isInput());
-			credentialModel.setSecret(entity.isSecret());
-			credentialModel.setType(entity.getType());
-
-			result.add(credentialModel);
-		}
-		return result;
-	}
-
-	protected RequiredCredentialModel initRequiredCredentialModel(String type) {
-		RequiredCredentialModel credentialModel = RequiredCredentialModel.BUILT_IN.get(type);
-		if (credentialModel == null) {
-			throw new RuntimeException("Unknown credential type " + type);
-		}
-		return credentialModel;
-	}
-
-	@Override
-	public Map<String, String> getBrowserSecurityHeaders() {
-		return realm.getBrowserSecurityHeaders();
-	}
-
-	@Override
-	public void setBrowserSecurityHeaders(Map<String, String> headers) {
-		realm.setBrowserSecurityHeaders(headers);
-	}
-
-	@Override
-	public Map<String, String> getSmtpConfig() {
-		return realm.getSmtpConfig();
-	}
-
-	@Override
-	public void setSmtpConfig(Map<String, String> smtpConfig) {
-		realm.setSmtpConfig(smtpConfig);
-	}
-
-	@Override
-	public List<IdentityProviderModel> getIdentityProviders() {
-		return new ArrayList<IdentityProviderModel>(allIdProviders.values());
-	}
-
-	@Override
-	public IdentityProviderModel getIdentityProviderById(String identityProviderId) {
-		for (IdentityProviderModel identityProviderModel : getIdentityProviders()) {
-			if (identityProviderModel.getId().equals(identityProviderId)) {
-				return identityProviderModel;
-			}
-		}
-
-		return null;
-	}
-
-	@Override
-	public void addIdentityProvider(IdentityProviderModel identityProvider) {
-		if (identityProvider.getId() == null)
-			throw new NullPointerException("identityProvider.getId() == null");
-		if (identityProvider.getInternalId() == null)
-			identityProvider.setInternalId(KeycloakModelUtils.generateId());
-		allIdProviders.put(identityProvider.getInternalId(), identityProvider);
-	}
-
-	@Override
-	public void removeIdentityProviderById(String providerId) {
-		for (IdentityProviderModel provider : getIdentityProviders()) {
-			if (provider.getId().equals(providerId)) {
-				allIdProviders.remove(provider.getInternalId());
-				break;
-			}
-		}
-	}
-
-	@Override
-	public void updateIdentityProvider(IdentityProviderModel identityProvider) {
-		removeIdentityProviderById(identityProvider.getId());
-		addIdentityProvider(identityProvider);
-	}
-
-	@Override
-	public UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config,
-			int priority, String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync) {
-		UserFederationProviderEntity entity = new UserFederationProviderEntity();
-		entity.setId(KeycloakModelUtils.generateId());
-		entity.setPriority(priority);
-		entity.setProviderName(providerName);
-		entity.setConfig(config);
-		if (displayName == null) {
-			displayName = entity.getId();
-		}
-		entity.setDisplayName(displayName);
-		entity.setFullSyncPeriod(fullSyncPeriod);
-		entity.setChangedSyncPeriod(changedSyncPeriod);
-		entity.setLastSync(lastSync);
-		realm.getUserFederationProviders().add(entity);
-
-		return new UserFederationProviderModel(entity.getId(), providerName, config, priority, displayName, fullSyncPeriod,
-				changedSyncPeriod, lastSync);
-	}
-
-	@Override
-	public void removeUserFederationProvider(UserFederationProviderModel provider) {
-		Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
-		while (it.hasNext()) {
-			UserFederationProviderEntity entity = it.next();
-			if (entity.getId().equals(provider.getId())) {
-				session.users().preRemove(
-						this,
-						new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
-								.getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(),
-								entity.getLastSync()));
-				it.remove();
-			}
-		}
-	}
-
-	@Override
-	public void updateUserFederationProvider(UserFederationProviderModel model) {
-		Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
-		while (it.hasNext()) {
-			UserFederationProviderEntity entity = it.next();
-			if (entity.getId().equals(model.getId())) {
-				entity.setProviderName(model.getProviderName());
-				entity.setConfig(model.getConfig());
-				entity.setPriority(model.getPriority());
-				String displayName = model.getDisplayName();
-				if (displayName != null) {
-					entity.setDisplayName(model.getDisplayName());
-				}
-				entity.setFullSyncPeriod(model.getFullSyncPeriod());
-				entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
-				entity.setLastSync(model.getLastSync());
-			}
-		}
-	}
-
-	@Override
-	public List<UserFederationProviderModel> getUserFederationProviders() {
-		List<UserFederationProviderEntity> entities = realm.getUserFederationProviders();
-		List<UserFederationProviderEntity> copy = new LinkedList<UserFederationProviderEntity>();
-		for (UserFederationProviderEntity entity : entities) {
-			copy.add(entity);
-
-		}
-		Collections.sort(copy, new Comparator<UserFederationProviderEntity>() {
-
-			@Override
-			public int compare(UserFederationProviderEntity o1, UserFederationProviderEntity o2) {
-				return o1.getPriority() - o2.getPriority();
-			}
-
-		});
-		List<UserFederationProviderModel> result = new LinkedList<UserFederationProviderModel>();
-		for (UserFederationProviderEntity entity : copy) {
-			result.add(new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
-					.getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(), entity
-					.getLastSync()));
-		}
-
-		return result;
-	}
-
-	@Override
-	public void setUserFederationProviders(List<UserFederationProviderModel> providers) {
-		List<UserFederationProviderEntity> entities = new LinkedList<UserFederationProviderEntity>();
-		for (UserFederationProviderModel model : providers) {
-			UserFederationProviderEntity entity = new UserFederationProviderEntity();
-			if (model.getId() != null)
-				entity.setId(model.getId());
-			else
-				entity.setId(KeycloakModelUtils.generateId());
-			entity.setProviderName(model.getProviderName());
-			entity.setConfig(model.getConfig());
-			entity.setPriority(model.getPriority());
-			String displayName = model.getDisplayName();
-			if (displayName == null) {
-				entity.setDisplayName(entity.getId());
-			}
-			entity.setDisplayName(displayName);
-			entity.setFullSyncPeriod(model.getFullSyncPeriod());
-			entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
-			entity.setLastSync(model.getLastSync());
-			entities.add(entity);
-		}
-
-		realm.setUserFederationProviders(entities);
-	}
-
-	@Override
-	public boolean isEventsEnabled() {
-		return realm.isEventsEnabled();
-	}
-
-	@Override
-	public void setEventsEnabled(boolean enabled) {
-		realm.setEventsEnabled(enabled);
-	}
-
-	@Override
-	public long getEventsExpiration() {
-		return realm.getEventsExpiration();
-	}
-
-	@Override
-	public void setEventsExpiration(long expiration) {
-		realm.setEventsExpiration(expiration);
-	}
-
-	@Override
-	public Set<String> getEventsListeners() {
-		return new HashSet<String>(realm.getEventsListeners());
-	}
-
-	@Override
-	public void setEventsListeners(Set<String> listeners) {
-		if (listeners != null) {
-			realm.setEventsListeners(new ArrayList<String>(listeners));
-		} else {
-			realm.setEventsListeners(Collections.EMPTY_LIST);
-		}
-	}
-
-	@Override
-	public ApplicationModel getMasterAdminApp() {
-		return this.masterAdminApp;
-	}
-
-	@Override
-	public void setMasterAdminApp(ApplicationModel app) {
-		if (app == null) {
-			realm.setAdminAppId(null);
-			this.masterAdminApp = null;
-		} else {
-			String appId = app.getId();
-			if (appId == null) {
-				throw new IllegalStateException("Master Admin app not initialized.");
-			}
-			realm.setAdminAppId(appId);
-			this.masterAdminApp = app;
-		}
-	}
-
-	@Override
-	public boolean isIdentityFederationEnabled() {
-		// TODO: not sure if we will support identity federation storage for file
-		return getIdentityProviders() != null && !getIdentityProviders().isEmpty();
-	}
-
-	@Override
-	public int getAccessCodeLifespanLogin() {
-		return realm.getAccessCodeLifespanLogin();
-	}
-
-	@Override
-	public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
-		realm.setAccessCodeLifespanLogin(accessCodeLifespanLogin);
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if (this == o)
-			return true;
-		if (o == null || !(o instanceof RealmModel))
-			return false;
-
-		RealmModel that = (RealmModel) o;
-		return that.getId().equals(getId());
-	}
-
-	@Override
-	public int hashCode() {
-		return getId().hashCode();
-	}
+    private final InMemoryModel inMemoryModel;
+    private final RealmEntity realm;
+
+    protected volatile transient PublicKey publicKey;
+    protected volatile transient PrivateKey privateKey;
+    protected volatile transient X509Certificate certificate;
+    protected volatile transient Key codeSecretKey;
+
+    private volatile transient PasswordPolicy passwordPolicy;
+    private volatile transient KeycloakSession session;
+
+    private final Map<String, ApplicationModel> allApps = new HashMap<String, ApplicationModel>();
+    private ApplicationModel masterAdminApp = null;
+    private final Map<String, RoleAdapter> allRoles = new HashMap<String, RoleAdapter>();
+    private final Map<String, OAuthClientAdapter> allOAuthClients = new HashMap<String, OAuthClientAdapter>();
+    private final Map<String, IdentityProviderModel> allIdProviders = new HashMap<String, IdentityProviderModel>();
+
+    public RealmAdapter(KeycloakSession session, RealmEntity realm, InMemoryModel inMemoryModel) {
+        this.session = session;
+        this.realm = realm;
+        this.inMemoryModel = inMemoryModel;
+    }
+
+    public RealmEntity getRealmEnity() {
+        return realm;
+    }
+
+    @Override
+    public String getId() {
+        return realm.getId();
+    }
+
+    @Override
+    public String getName() {
+        return realm.getName();
+    }
+
+    @Override
+    public void setName(String name) {
+        if (getName() == null) {
+            realm.setName(name);
+            return;
+        }
+
+        if (getName().equals(name))
+            return; // allow setting name to same value
+
+        if (inMemoryModel.getRealmByName(name) != null)
+            throw new ModelDuplicateException("Realm " + name + " already exists.");
+        realm.setName(name);
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return realm.isEnabled();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        realm.setEnabled(enabled);
+    }
+
+    @Override
+    public SslRequired getSslRequired() {
+        return SslRequired.valueOf(realm.getSslRequired());
+    }
+
+    @Override
+    public void setSslRequired(SslRequired sslRequired) {
+        realm.setSslRequired(sslRequired.name());
+    }
+
+    @Override
+    public boolean isPasswordCredentialGrantAllowed() {
+        return realm.isPasswordCredentialGrantAllowed();
+    }
+
+    @Override
+    public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
+        realm.setPasswordCredentialGrantAllowed(passwordCredentialGrantAllowed);
+    }
+
+    @Override
+    public boolean isRegistrationAllowed() {
+        return realm.isRegistrationAllowed();
+    }
+
+    @Override
+    public void setRegistrationAllowed(boolean registrationAllowed) {
+        realm.setRegistrationAllowed(registrationAllowed);
+    }
+
+    @Override
+    public boolean isRegistrationEmailAsUsername() {
+        return realm.isRegistrationEmailAsUsername();
+    }
+
+    @Override
+    public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
+        realm.setRegistrationEmailAsUsername(registrationEmailAsUsername);
+    }
+
+    @Override
+    public boolean isRememberMe() {
+        return realm.isRememberMe();
+    }
+
+    @Override
+    public void setRememberMe(boolean rememberMe) {
+        realm.setRememberMe(rememberMe);
+    }
+
+    @Override
+    public boolean isBruteForceProtected() {
+        return realm.isBruteForceProtected();
+    }
+
+    @Override
+    public void setBruteForceProtected(boolean value) {
+        realm.setBruteForceProtected(value);
+    }
+
+    @Override
+    public int getMaxFailureWaitSeconds() {
+        return realm.getMaxFailureWaitSeconds();
+    }
+
+    @Override
+    public void setMaxFailureWaitSeconds(int val) {
+        realm.setMaxFailureWaitSeconds(val);
+    }
+
+    @Override
+    public int getWaitIncrementSeconds() {
+        return realm.getWaitIncrementSeconds();
+    }
+
+    @Override
+    public void setWaitIncrementSeconds(int val) {
+        realm.setWaitIncrementSeconds(val);
+    }
+
+    @Override
+    public long getQuickLoginCheckMilliSeconds() {
+        return realm.getQuickLoginCheckMilliSeconds();
+    }
+
+    @Override
+    public void setQuickLoginCheckMilliSeconds(long val) {
+        realm.setQuickLoginCheckMilliSeconds(val);
+    }
+
+    @Override
+    public int getMinimumQuickLoginWaitSeconds() {
+        return realm.getMinimumQuickLoginWaitSeconds();
+    }
+
+    @Override
+    public void setMinimumQuickLoginWaitSeconds(int val) {
+        realm.setMinimumQuickLoginWaitSeconds(val);
+    }
+
+    @Override
+    public int getMaxDeltaTimeSeconds() {
+        return realm.getMaxDeltaTimeSeconds();
+    }
+
+    @Override
+    public void setMaxDeltaTimeSeconds(int val) {
+        realm.setMaxDeltaTimeSeconds(val);
+    }
+
+    @Override
+    public int getFailureFactor() {
+        return realm.getFailureFactor();
+    }
+
+    @Override
+    public void setFailureFactor(int failureFactor) {
+        realm.setFailureFactor(failureFactor);
+    }
+
+    @Override
+    public boolean isVerifyEmail() {
+        return realm.isVerifyEmail();
+    }
+
+    @Override
+    public void setVerifyEmail(boolean verifyEmail) {
+        realm.setVerifyEmail(verifyEmail);
+    }
+
+    @Override
+    public boolean isResetPasswordAllowed() {
+        return realm.isResetPasswordAllowed();
+    }
+
+    @Override
+    public void setResetPasswordAllowed(boolean resetPassword) {
+        realm.setResetPasswordAllowed(resetPassword);
+    }
+
+    @Override
+    public PasswordPolicy getPasswordPolicy() {
+        if (passwordPolicy == null) {
+            passwordPolicy = new PasswordPolicy(realm.getPasswordPolicy());
+        }
+        return passwordPolicy;
+    }
+
+    @Override
+    public void setPasswordPolicy(PasswordPolicy policy) {
+        this.passwordPolicy = policy;
+        realm.setPasswordPolicy(policy.toString());
+    }
+
+    @Override
+    public int getNotBefore() {
+        return realm.getNotBefore();
+    }
+
+    @Override
+    public void setNotBefore(int notBefore) {
+        realm.setNotBefore(notBefore);
+    }
+
+    @Override
+    public int getSsoSessionIdleTimeout() {
+        return realm.getSsoSessionIdleTimeout();
+    }
+
+    @Override
+    public void setSsoSessionIdleTimeout(int seconds) {
+        realm.setSsoSessionIdleTimeout(seconds);
+    }
+
+    @Override
+    public int getSsoSessionMaxLifespan() {
+        return realm.getSsoSessionMaxLifespan();
+    }
+
+    @Override
+    public void setSsoSessionMaxLifespan(int seconds) {
+        realm.setSsoSessionMaxLifespan(seconds);
+    }
+
+    @Override
+    public int getAccessTokenLifespan() {
+        return realm.getAccessTokenLifespan();
+    }
+
+    @Override
+    public void setAccessTokenLifespan(int tokenLifespan) {
+        realm.setAccessTokenLifespan(tokenLifespan);
+    }
+
+    @Override
+    public int getAccessCodeLifespan() {
+        return realm.getAccessCodeLifespan();
+    }
+
+    @Override
+    public void setAccessCodeLifespan(int accessCodeLifespan) {
+        realm.setAccessCodeLifespan(accessCodeLifespan);
+    }
+
+    @Override
+    public int getAccessCodeLifespanUserAction() {
+        return realm.getAccessCodeLifespanUserAction();
+    }
+
+    @Override
+    public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
+        realm.setAccessCodeLifespanUserAction(accessCodeLifespanUserAction);
+    }
+
+    @Override
+    public String getPublicKeyPem() {
+        return realm.getPublicKeyPem();
+    }
+
+    @Override
+    public void setPublicKeyPem(String publicKeyPem) {
+        realm.setPublicKeyPem(publicKeyPem);
+        this.publicKey = null;
+    }
+
+    @Override
+    public X509Certificate getCertificate() {
+        if (certificate != null)
+            return certificate;
+        certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
+        return certificate;
+    }
+
+    @Override
+    public void setCertificate(X509Certificate certificate) {
+        this.certificate = certificate;
+        String certificatePem = KeycloakModelUtils.getPemFromCertificate(certificate);
+        setCertificatePem(certificatePem);
+    }
+
+    @Override
+    public String getCertificatePem() {
+        return realm.getCertificatePem();
+    }
+
+    @Override
+    public void setCertificatePem(String certificate) {
+        realm.setCertificatePem(certificate);
+
+    }
+
+    @Override
+    public String getPrivateKeyPem() {
+        return realm.getPrivateKeyPem();
+    }
+
+    @Override
+    public void setPrivateKeyPem(String privateKeyPem) {
+        realm.setPrivateKeyPem(privateKeyPem);
+        this.privateKey = null;
+    }
+
+    @Override
+    public PublicKey getPublicKey() {
+        if (publicKey != null)
+            return publicKey;
+        publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
+        return publicKey;
+    }
+
+    @Override
+    public void setPublicKey(PublicKey publicKey) {
+        this.publicKey = publicKey;
+        String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
+        setPublicKeyPem(publicKeyPem);
+    }
+
+    @Override
+    public PrivateKey getPrivateKey() {
+        if (privateKey != null)
+            return privateKey;
+        privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
+        return privateKey;
+    }
+
+    @Override
+    public void setPrivateKey(PrivateKey privateKey) {
+        this.privateKey = privateKey;
+        String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
+        setPrivateKeyPem(privateKeyPem);
+    }
+
+    @Override
+    public String getCodeSecret() {
+        return realm.getCodeSecret();
+    }
+
+    @Override
+    public Key getCodeSecretKey() {
+        if (codeSecretKey == null) {
+            codeSecretKey = KeycloakModelUtils.getSecretKey(getCodeSecret());
+        }
+        return codeSecretKey;
+    }
+
+    @Override
+    public void setCodeSecret(String codeSecret) {
+        realm.setCodeSecret(codeSecret);
+    }
+
+    @Override
+    public String getLoginTheme() {
+        return realm.getLoginTheme();
+    }
+
+    @Override
+    public void setLoginTheme(String name) {
+        realm.setLoginTheme(name);
+    }
+
+    @Override
+    public String getAccountTheme() {
+        return realm.getAccountTheme();
+    }
+
+    @Override
+    public void setAccountTheme(String name) {
+        realm.setAccountTheme(name);
+    }
+
+    @Override
+    public String getAdminTheme() {
+        return realm.getAdminTheme();
+    }
+
+    @Override
+    public void setAdminTheme(String name) {
+        realm.setAdminTheme(name);
+    }
+
+    @Override
+    public String getEmailTheme() {
+        return realm.getEmailTheme();
+    }
+
+    @Override
+    public void setEmailTheme(String name) {
+        realm.setEmailTheme(name);
+    }
+
+    @Override
+    public RoleAdapter getRole(String name) {
+        for (RoleAdapter role : allRoles.values()) {
+            if (role.getName().equals(name))
+                return role;
+        }
+        return null;
+    }
+
+    @Override
+    public RoleModel addRole(String name) {
+        return this.addRole(KeycloakModelUtils.generateId(), name);
+    }
+
+    @Override
+    public RoleModel addRole(String id, String name) {
+        if (id == null)
+            throw new NullPointerException("id == null");
+        if (name == null)
+            throw new NullPointerException("name == null");
+        if (hasRoleWithName(name))
+            throw new ModelDuplicateException("Realm already contains role with name " + name + ".");
+
+        RoleEntity roleEntity = new RoleEntity();
+        roleEntity.setId(id);
+        roleEntity.setName(name);
+        roleEntity.setRealmId(getId());
+
+        RoleAdapter roleModel = new RoleAdapter(this, roleEntity, this);
+        allRoles.put(id, roleModel);
+        return roleModel;
+    }
+
+    @Override
+    public boolean removeRole(RoleModel role) {
+        return removeRoleById(role.getId());
+    }
+
+    @Override
+    public boolean removeRoleById(String id) {
+        if (id == null)
+            throw new NullPointerException("id == null");
+
+        // try realm roles first
+        if (allRoles.remove(id) != null)
+            return true;
+
+        for (ApplicationModel app : getApplications()) {
+            for (RoleModel appRole : app.getRoles()) {
+                if (id.equals(appRole.getId())) {
+                    app.removeRole(appRole);
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    public Set<RoleModel> getRoles() {
+        return new HashSet<RoleModel>(allRoles.values());
+    }
+
+    @Override
+    public RoleModel getRoleById(String id) {
+        RoleModel found = allRoles.get(id);
+        if (found != null)
+            return found;
+
+        for (ApplicationModel app : getApplications()) {
+            for (RoleModel appRole : app.getRoles()) {
+                if (appRole.getId().equals(id))
+                    return appRole;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public List<String> getDefaultRoles() {
+        return realm.getDefaultRoles();
+    }
+
+    @Override
+    public void addDefaultRole(String name) {
+        RoleModel role = getRole(name);
+        if (role == null) {
+            addRole(name);
+        }
+
+        List<String> roleNames = getDefaultRoles();
+        if (roleNames.contains(name))
+            throw new IllegalArgumentException("Realm " + realm.getName() + " already contains default role named " + name);
+
+        roleNames.add(name);
+        realm.setDefaultRoles(roleNames);
+    }
+
+    boolean hasRoleWithName(String name) {
+        for (RoleModel role : allRoles.values()) {
+            if (role.getName().equals(name))
+                return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    public void updateDefaultRoles(String[] defaultRoles) {
+        List<String> roleNames = new ArrayList<String>();
+        for (String roleName : defaultRoles) {
+            RoleModel role = getRole(roleName);
+            if (role == null) {
+                addRole(roleName);
+            }
+
+            roleNames.add(roleName);
+        }
+
+        realm.setDefaultRoles(roleNames);
+    }
+
+    @Override
+    public ClientModel findClient(String clientId) {
+        ClientModel model = getApplicationByName(clientId);
+        if (model != null)
+            return model;
+        return getOAuthClient(clientId);
+    }
+
+    @Override
+    public ClientModel findClientById(String id) {
+        ClientModel clientModel = getApplicationById(id);
+        if (clientModel != null)
+            return clientModel;
+        return getOAuthClientById(id);
+    }
+
+    @Override
+    public ApplicationModel getApplicationById(String id) {
+        return allApps.get(id);
+    }
+
+    @Override
+    public ApplicationModel getApplicationByName(String name) {
+        for (ApplicationModel app : getApplications()) {
+            if (app.getName().equals(name))
+                return app;
+        }
+
+        return null;
+    }
+
+    @Override
+    public Map<String, ApplicationModel> getApplicationNameMap() {
+        Map<String, ApplicationModel> resourceMap = new HashMap<String, ApplicationModel>();
+        for (ApplicationModel resource : getApplications()) {
+            resourceMap.put(resource.getName(), resource);
+        }
+        return resourceMap;
+    }
+
+    @Override
+    public List<ApplicationModel> getApplications() {
+        return new ArrayList<ApplicationModel>(allApps.values());
+    }
+
+    @Override
+    public ApplicationModel addApplication(String name) {
+        return this.addApplication(KeycloakModelUtils.generateId(), name);
+    }
+
+    @Override
+    public ApplicationModel addApplication(String id, String name) {
+        if (name == null)
+            throw new NullPointerException("name == null");
+        if (id == null)
+            throw new NullPointerException("id == null");
+
+        if (getApplicationNameMap().containsKey(name)) {
+            throw new ModelDuplicateException("Application named '" + name + "' already exists.");
+        }
+
+        ApplicationEntity appEntity = new ApplicationEntity();
+        appEntity.setId(id);
+        appEntity.setName(name);
+        appEntity.setRealmId(getId());
+        appEntity.setEnabled(true);
+
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setId(id);
+        clientEntity.setName(name);
+        clientEntity.setRealmId(getId());
+        clientEntity.setEnabled(true);
+
+        final ApplicationModel app = new ApplicationAdapter(session, this, appEntity, clientEntity, inMemoryModel);
+        session.getKeycloakSessionFactory().publish(new ApplicationCreationEvent() {
+            @Override
+            public ApplicationModel getCreatedApplication() {
+                return app;
+            }
+
+            @Override
+            public ClientModel getCreatedClient() {
+                return app;
+            }
+        });
+
+        allApps.put(id, app);
+
+        return app;
+    }
+
+    @Override
+    public boolean removeApplication(String id) {
+        ApplicationModel appToBeRemoved = this.getApplicationById(id);
+        if (appToBeRemoved == null)
+            return false;
+
+        // remove any composite role assignments for this app
+        for (RoleModel role : this.getRoles()) {
+            RoleAdapter roleAdapter = (RoleAdapter) role;
+            roleAdapter.removeApplicationComposites(id);
+        }
+
+        for (RoleModel role : appToBeRemoved.getRoles()) {
+            appToBeRemoved.removeRole(role);
+        }
+
+        return (allApps.remove(id) != null);
+    }
+
+    @Override
+    public OAuthClientModel addOAuthClient(String name) {
+        return this.addOAuthClient(KeycloakModelUtils.generateId(), name);
+    }
+
+    @Override
+    public OAuthClientModel addOAuthClient(String id, String name) {
+        if (id == null)
+            throw new NullPointerException("id == null");
+        if (name == null)
+            throw new NullPointerException("name == null");
+        if (hasOAuthClientWithName(name))
+            throw new ModelDuplicateException("OAuth Client with name " + name + " already exists.");
+        OAuthClientEntity oauthClient = new OAuthClientEntity();
+        oauthClient.setId(id);
+        oauthClient.setRealmId(getId());
+        oauthClient.setName(name);
+
+        OAuthClientAdapter oAuthClient = new OAuthClientAdapter(session, this, oauthClient);
+        allOAuthClients.put(id, oAuthClient);
+
+        return oAuthClient;
+    }
+
+    boolean hasOAuthClientWithName(String name) {
+        for (OAuthClientAdapter oaClient : allOAuthClients.values()) {
+            if (oaClient.getName().equals(name))
+                return true;
+        }
+
+        return false;
+    }
+
+    boolean hasOAuthClientWithClientId(String id) {
+        for (OAuthClientAdapter oaClient : allOAuthClients.values()) {
+            if (oaClient.getClientId().equals(id))
+                return true;
+        }
+
+        return false;
+    }
+
+    boolean hasUserWithEmail(String email) {
+        for (UserModel user : inMemoryModel.getUsers(getId())) {
+            if (user.getEmail() == null)
+                continue;
+            if (user.getEmail().equals(email))
+                return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean removeOAuthClient(String id) {
+        return allOAuthClients.remove(id) != null;
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClient(String name) {
+        for (OAuthClientAdapter oAuthClient : allOAuthClients.values()) {
+            if (oAuthClient.getName().equals(name))
+                return oAuthClient;
+        }
+
+        return null;
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClientById(String id) {
+        for (OAuthClientAdapter oAuthClient : allOAuthClients.values()) {
+            if (oAuthClient.getId().equals(id))
+                return oAuthClient;
+        }
+
+        return null;
+    }
+
+    @Override
+    public List<OAuthClientModel> getOAuthClients() {
+        return new ArrayList<OAuthClientModel>(allOAuthClients.values());
+    }
+
+    @Override
+    public void addRequiredCredential(String type) {
+        RequiredCredentialModel credentialModel = initRequiredCredentialModel(type);
+        addRequiredCredential(credentialModel, realm.getRequiredCredentials());
+    }
+
+    protected void addRequiredCredential(RequiredCredentialModel credentialModel,
+            List<RequiredCredentialEntity> persistentCollection) {
+        RequiredCredentialEntity credEntity = new RequiredCredentialEntity();
+        credEntity.setType(credentialModel.getType());
+        credEntity.setFormLabel(credentialModel.getFormLabel());
+        credEntity.setInput(credentialModel.isInput());
+        credEntity.setSecret(credentialModel.isSecret());
+
+        persistentCollection.add(credEntity);
+    }
+
+    @Override
+    public void updateRequiredCredentials(Set<String> creds) {
+        updateRequiredCredentials(creds, realm.getRequiredCredentials());
+    }
+
+    protected void updateRequiredCredentials(Set<String> creds, List<RequiredCredentialEntity> credsEntities) {
+        Set<String> already = new HashSet<String>();
+        Set<RequiredCredentialEntity> toRemove = new HashSet<RequiredCredentialEntity>();
+        for (RequiredCredentialEntity entity : credsEntities) {
+            if (!creds.contains(entity.getType())) {
+                toRemove.add(entity);
+            } else {
+                already.add(entity.getType());
+            }
+        }
+        for (RequiredCredentialEntity entity : toRemove) {
+            credsEntities.remove(entity);
+        }
+        for (String cred : creds) {
+            if (!already.contains(cred)) {
+                RequiredCredentialModel credentialModel = initRequiredCredentialModel(cred);
+                addRequiredCredential(credentialModel, credsEntities);
+            }
+        }
+    }
+
+    @Override
+    public List<RequiredCredentialModel> getRequiredCredentials() {
+        return convertRequiredCredentialEntities(realm.getRequiredCredentials());
+    }
+
+    protected List<RequiredCredentialModel> convertRequiredCredentialEntities(
+            Collection<RequiredCredentialEntity> credEntities) {
+
+        List<RequiredCredentialModel> result = new ArrayList<RequiredCredentialModel>();
+        for (RequiredCredentialEntity entity : credEntities) {
+            RequiredCredentialModel credentialModel = new RequiredCredentialModel();
+            credentialModel.setFormLabel(entity.getFormLabel());
+            credentialModel.setInput(entity.isInput());
+            credentialModel.setSecret(entity.isSecret());
+            credentialModel.setType(entity.getType());
+
+            result.add(credentialModel);
+        }
+        return result;
+    }
+
+    protected RequiredCredentialModel initRequiredCredentialModel(String type) {
+        RequiredCredentialModel credentialModel = RequiredCredentialModel.BUILT_IN.get(type);
+        if (credentialModel == null) {
+            throw new RuntimeException("Unknown credential type " + type);
+        }
+        return credentialModel;
+    }
+
+    @Override
+    public Map<String, String> getBrowserSecurityHeaders() {
+        return realm.getBrowserSecurityHeaders();
+    }
+
+    @Override
+    public void setBrowserSecurityHeaders(Map<String, String> headers) {
+        realm.setBrowserSecurityHeaders(headers);
+    }
+
+    @Override
+    public Map<String, String> getSmtpConfig() {
+        return realm.getSmtpConfig();
+    }
+
+    @Override
+    public void setSmtpConfig(Map<String, String> smtpConfig) {
+        realm.setSmtpConfig(smtpConfig);
+    }
+
+    @Override
+    public List<IdentityProviderModel> getIdentityProviders() {
+        return new ArrayList<IdentityProviderModel>(allIdProviders.values());
+    }
+
+    @Override
+    public IdentityProviderModel getIdentityProviderById(String identityProviderId) {
+        for (IdentityProviderModel identityProviderModel : getIdentityProviders()) {
+            if (identityProviderModel.getId().equals(identityProviderId)) {
+                return identityProviderModel;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public void addIdentityProvider(IdentityProviderModel identityProvider) {
+        if (identityProvider.getId() == null)
+            throw new NullPointerException("identityProvider.getId() == null");
+        if (identityProvider.getInternalId() == null)
+            identityProvider.setInternalId(KeycloakModelUtils.generateId());
+        allIdProviders.put(identityProvider.getInternalId(), identityProvider);
+    }
+
+    @Override
+    public void removeIdentityProviderById(String providerId) {
+        for (IdentityProviderModel provider : getIdentityProviders()) {
+            if (provider.getId().equals(providerId)) {
+                allIdProviders.remove(provider.getInternalId());
+                break;
+            }
+        }
+    }
+
+    @Override
+    public void updateIdentityProvider(IdentityProviderModel identityProvider) {
+        removeIdentityProviderById(identityProvider.getId());
+        addIdentityProvider(identityProvider);
+    }
+
+    @Override
+    public UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config,
+            int priority, String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync) {
+        UserFederationProviderEntity entity = new UserFederationProviderEntity();
+        entity.setId(KeycloakModelUtils.generateId());
+        entity.setPriority(priority);
+        entity.setProviderName(providerName);
+        entity.setConfig(config);
+        if (displayName == null) {
+            displayName = entity.getId();
+        }
+        entity.setDisplayName(displayName);
+        entity.setFullSyncPeriod(fullSyncPeriod);
+        entity.setChangedSyncPeriod(changedSyncPeriod);
+        entity.setLastSync(lastSync);
+        realm.getUserFederationProviders().add(entity);
+
+        return new UserFederationProviderModel(entity.getId(), providerName, config, priority, displayName, fullSyncPeriod,
+                changedSyncPeriod, lastSync);
+    }
+
+    @Override
+    public void removeUserFederationProvider(UserFederationProviderModel provider) {
+        Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
+        while (it.hasNext()) {
+            UserFederationProviderEntity entity = it.next();
+            if (entity.getId().equals(provider.getId())) {
+                session.users().preRemove(
+                        this,
+                        new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
+                                .getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(),
+                                entity.getLastSync()));
+                it.remove();
+            }
+        }
+    }
+
+    @Override
+    public void updateUserFederationProvider(UserFederationProviderModel model) {
+        Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
+        while (it.hasNext()) {
+            UserFederationProviderEntity entity = it.next();
+            if (entity.getId().equals(model.getId())) {
+                entity.setProviderName(model.getProviderName());
+                entity.setConfig(model.getConfig());
+                entity.setPriority(model.getPriority());
+                String displayName = model.getDisplayName();
+                if (displayName != null) {
+                    entity.setDisplayName(model.getDisplayName());
+                }
+                entity.setFullSyncPeriod(model.getFullSyncPeriod());
+                entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
+                entity.setLastSync(model.getLastSync());
+            }
+        }
+    }
+
+    @Override
+    public List<UserFederationProviderModel> getUserFederationProviders() {
+        List<UserFederationProviderEntity> entities = realm.getUserFederationProviders();
+        List<UserFederationProviderEntity> copy = new LinkedList<UserFederationProviderEntity>();
+        for (UserFederationProviderEntity entity : entities) {
+            copy.add(entity);
+
+        }
+        Collections.sort(copy, new Comparator<UserFederationProviderEntity>() {
+
+            @Override
+            public int compare(UserFederationProviderEntity o1, UserFederationProviderEntity o2) {
+                return o1.getPriority() - o2.getPriority();
+            }
+
+        });
+        List<UserFederationProviderModel> result = new LinkedList<UserFederationProviderModel>();
+        for (UserFederationProviderEntity entity : copy) {
+            result.add(new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
+                    .getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(), entity
+                    .getLastSync()));
+        }
+
+        return result;
+    }
+
+    @Override
+    public void setUserFederationProviders(List<UserFederationProviderModel> providers) {
+        List<UserFederationProviderEntity> entities = new LinkedList<UserFederationProviderEntity>();
+        for (UserFederationProviderModel model : providers) {
+            UserFederationProviderEntity entity = new UserFederationProviderEntity();
+            if (model.getId() != null)
+                entity.setId(model.getId());
+            else
+                entity.setId(KeycloakModelUtils.generateId());
+            entity.setProviderName(model.getProviderName());
+            entity.setConfig(model.getConfig());
+            entity.setPriority(model.getPriority());
+            String displayName = model.getDisplayName();
+            if (displayName == null) {
+                entity.setDisplayName(entity.getId());
+            }
+            entity.setDisplayName(displayName);
+            entity.setFullSyncPeriod(model.getFullSyncPeriod());
+            entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
+            entity.setLastSync(model.getLastSync());
+            entities.add(entity);
+        }
+
+        realm.setUserFederationProviders(entities);
+    }
+
+    @Override
+    public boolean isEventsEnabled() {
+        return realm.isEventsEnabled();
+    }
+
+    @Override
+    public void setEventsEnabled(boolean enabled) {
+        realm.setEventsEnabled(enabled);
+    }
+
+    @Override
+    public long getEventsExpiration() {
+        return realm.getEventsExpiration();
+    }
+
+    @Override
+    public void setEventsExpiration(long expiration) {
+        realm.setEventsExpiration(expiration);
+    }
+
+    @Override
+    public Set<String> getEventsListeners() {
+        return new HashSet<String>(realm.getEventsListeners());
+    }
+
+    @Override
+    public void setEventsListeners(Set<String> listeners) {
+        if (listeners != null) {
+            realm.setEventsListeners(new ArrayList<String>(listeners));
+        } else {
+            realm.setEventsListeners(Collections.EMPTY_LIST);
+        }
+    }
+
+    @Override
+    public ApplicationModel getMasterAdminApp() {
+        return this.masterAdminApp;
+    }
+
+    @Override
+    public void setMasterAdminApp(ApplicationModel app) {
+        if (app == null) {
+            realm.setAdminAppId(null);
+            this.masterAdminApp = null;
+        } else {
+            String appId = app.getId();
+            if (appId == null) {
+                throw new IllegalStateException("Master Admin app not initialized.");
+            }
+            realm.setAdminAppId(appId);
+            this.masterAdminApp = app;
+        }
+    }
+
+    @Override
+    public boolean isIdentityFederationEnabled() {
+        // TODO: not sure if we will support identity federation storage for file
+        return getIdentityProviders() != null && !getIdentityProviders().isEmpty();
+    }
+
+    @Override
+    public int getAccessCodeLifespanLogin() {
+        return realm.getAccessCodeLifespanLogin();
+    }
+
+    @Override
+    public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
+        realm.setAccessCodeLifespanLogin(accessCodeLifespanLogin);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || !(o instanceof RealmModel))
+            return false;
+
+        RealmModel that = (RealmModel) o;
+        return that.getId().equals(getId());
+    }
+
+    @Override
+    public int hashCode() {
+        return getId().hashCode();
+    }
 }
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedRealm.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedRealm.java
index 2372746..fd2b838 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedRealm.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/entities/CachedRealm.java
@@ -26,329 +26,329 @@ import org.keycloak.models.cache.RealmCache;
  */
 public class CachedRealm {
 
-	private String id;
-	private String name;
-	private boolean enabled;
-	private SslRequired sslRequired;
-	private boolean registrationAllowed;
-	protected boolean registrationEmailAsUsername;
-	private boolean rememberMe;
-	private boolean verifyEmail;
-	private boolean passwordCredentialGrantAllowed;
-	private boolean resetPasswordAllowed;
-	private boolean identityFederationEnabled;
-	// --- brute force settings
-	private boolean bruteForceProtected;
-	private int maxFailureWaitSeconds;
-	private int minimumQuickLoginWaitSeconds;
-	private int waitIncrementSeconds;
-	private long quickLoginCheckMilliSeconds;
-	private int maxDeltaTimeSeconds;
-	private int failureFactor;
-	// --- end brute force settings
-
-	private int ssoSessionIdleTimeout;
-	private int ssoSessionMaxLifespan;
-	private int accessTokenLifespan;
-	private int accessCodeLifespan;
-	private int accessCodeLifespanUserAction;
-	private int accessCodeLifespanLogin;
-	private int notBefore;
-	private PasswordPolicy passwordPolicy;
-
-	private String publicKeyPem;
-	private String privateKeyPem;
-	private String certificatePem;
-	private String codeSecret;
-
-	private String loginTheme;
-	private String accountTheme;
-	private String adminTheme;
-	private String emailTheme;
-	private String masterAdminApp;
-
-	private List<RequiredCredentialModel> requiredCredentials = new ArrayList<RequiredCredentialModel>();
-	private List<UserFederationProviderModel> userFederationProviders = new ArrayList<UserFederationProviderModel>();
-	private List<IdentityProviderModel> identityProviders = new ArrayList<IdentityProviderModel>();
-
-	private Map<String, String> browserSecurityHeaders = new HashMap<String, String>();
-	private Map<String, String> smtpConfig = new HashMap<String, String>();
-
-	private boolean eventsEnabled;
-	private long eventsExpiration;
-	private Set<String> eventsListeners = new HashSet<String>();
-	private List<String> defaultRoles = new LinkedList<String>();
-	private Map<String, String> realmRoles = new HashMap<String, String>();
-	private Map<String, String> applications = new HashMap<String, String>();
-	private Map<String, String> clients = new HashMap<String, String>();
-
-	public CachedRealm() {
-	}
-
-	public CachedRealm(RealmCache cache, RealmProvider delegate, RealmModel model) {
-		id = model.getId();
-		name = model.getName();
-		enabled = model.isEnabled();
-		sslRequired = model.getSslRequired();
-		registrationAllowed = model.isRegistrationAllowed();
-		registrationEmailAsUsername = model.isRegistrationEmailAsUsername();
-		rememberMe = model.isRememberMe();
-		verifyEmail = model.isVerifyEmail();
-		passwordCredentialGrantAllowed = model.isPasswordCredentialGrantAllowed();
-		resetPasswordAllowed = model.isResetPasswordAllowed();
-		identityFederationEnabled = model.isIdentityFederationEnabled();
-		// --- brute force settings
-		bruteForceProtected = model.isBruteForceProtected();
-		maxFailureWaitSeconds = model.getMaxFailureWaitSeconds();
-		minimumQuickLoginWaitSeconds = model.getMinimumQuickLoginWaitSeconds();
-		waitIncrementSeconds = model.getWaitIncrementSeconds();
-		quickLoginCheckMilliSeconds = model.getQuickLoginCheckMilliSeconds();
-		maxDeltaTimeSeconds = model.getMaxDeltaTimeSeconds();
-		failureFactor = model.getFailureFactor();
-		// --- end brute force settings
-
-		ssoSessionIdleTimeout = model.getSsoSessionIdleTimeout();
-		ssoSessionMaxLifespan = model.getSsoSessionMaxLifespan();
-		accessTokenLifespan = model.getAccessTokenLifespan();
-		accessCodeLifespan = model.getAccessCodeLifespan();
-		accessCodeLifespanUserAction = model.getAccessCodeLifespanUserAction();
-		accessCodeLifespanLogin = model.getAccessCodeLifespanLogin();
-		notBefore = model.getNotBefore();
-		passwordPolicy = model.getPasswordPolicy();
-
-		publicKeyPem = model.getPublicKeyPem();
-		privateKeyPem = model.getPrivateKeyPem();
-		certificatePem = model.getCertificatePem();
-		codeSecret = model.getCodeSecret();
-
-		loginTheme = model.getLoginTheme();
-		accountTheme = model.getAccountTheme();
-		adminTheme = model.getAdminTheme();
-		emailTheme = model.getEmailTheme();
-
-		requiredCredentials = model.getRequiredCredentials();
-		userFederationProviders = model.getUserFederationProviders();
-
-		this.identityProviders = new ArrayList<IdentityProviderModel>();
-
-		for (IdentityProviderModel identityProviderModel : model.getIdentityProviders()) {
-			this.identityProviders.add(new IdentityProviderModel(identityProviderModel));
-		}
-
-		smtpConfig.putAll(model.getSmtpConfig());
-		browserSecurityHeaders.putAll(model.getBrowserSecurityHeaders());
-
-		eventsEnabled = model.isEventsEnabled();
-		eventsExpiration = model.getEventsExpiration();
-		eventsListeners.addAll(model.getEventsListeners());
-		defaultRoles.addAll(model.getDefaultRoles());
-		masterAdminApp = model.getMasterAdminApp().getId();
-
-		for (RoleModel role : model.getRoles()) {
-			realmRoles.put(role.getName(), role.getId());
-			CachedRole cachedRole = new CachedRealmRole(role, model);
-			cache.addCachedRole(cachedRole);
-		}
-
-		for (ApplicationModel app : model.getApplications()) {
-			applications.put(app.getName(), app.getId());
-			CachedApplication cachedApp = new CachedApplication(cache, delegate, model, app);
-			cache.addCachedApplication(cachedApp);
-		}
-
-		for (OAuthClientModel client : model.getOAuthClients()) {
-			clients.put(client.getClientId(), client.getId());
-			CachedOAuthClient cachedApp = new CachedOAuthClient(cache, delegate, model, client);
-			cache.addCachedOAuthClient(cachedApp);
-		}
-
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	public String getMasterAdminApp() {
-		return masterAdminApp;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public List<String> getDefaultRoles() {
-		return defaultRoles;
-	}
-
-	public Map<String, String> getRealmRoles() {
-		return realmRoles;
-	}
-
-	public Map<String, String> getApplications() {
-		return applications;
-	}
-
-	public Map<String, String> getClients() {
-		return clients;
-	}
-
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	public SslRequired getSslRequired() {
-		return sslRequired;
-	}
-
-	public boolean isRegistrationAllowed() {
-		return registrationAllowed;
-	}
-
-	public boolean isRegistrationEmailAsUsername() {
-		return registrationEmailAsUsername;
-	}
-
-	public boolean isPasswordCredentialGrantAllowed() {
-		return passwordCredentialGrantAllowed;
-	}
-
-	public boolean isRememberMe() {
-		return this.rememberMe;
-	}
+    private String id;
+    private String name;
+    private boolean enabled;
+    private SslRequired sslRequired;
+    private boolean registrationAllowed;
+    protected boolean registrationEmailAsUsername;
+    private boolean rememberMe;
+    private boolean verifyEmail;
+    private boolean passwordCredentialGrantAllowed;
+    private boolean resetPasswordAllowed;
+    private boolean identityFederationEnabled;
+    // --- brute force settings
+    private boolean bruteForceProtected;
+    private int maxFailureWaitSeconds;
+    private int minimumQuickLoginWaitSeconds;
+    private int waitIncrementSeconds;
+    private long quickLoginCheckMilliSeconds;
+    private int maxDeltaTimeSeconds;
+    private int failureFactor;
+    // --- end brute force settings
+
+    private int ssoSessionIdleTimeout;
+    private int ssoSessionMaxLifespan;
+    private int accessTokenLifespan;
+    private int accessCodeLifespan;
+    private int accessCodeLifespanUserAction;
+    private int accessCodeLifespanLogin;
+    private int notBefore;
+    private PasswordPolicy passwordPolicy;
+
+    private String publicKeyPem;
+    private String privateKeyPem;
+    private String certificatePem;
+    private String codeSecret;
+
+    private String loginTheme;
+    private String accountTheme;
+    private String adminTheme;
+    private String emailTheme;
+    private String masterAdminApp;
+
+    private List<RequiredCredentialModel> requiredCredentials = new ArrayList<RequiredCredentialModel>();
+    private List<UserFederationProviderModel> userFederationProviders = new ArrayList<UserFederationProviderModel>();
+    private List<IdentityProviderModel> identityProviders = new ArrayList<IdentityProviderModel>();
+
+    private Map<String, String> browserSecurityHeaders = new HashMap<String, String>();
+    private Map<String, String> smtpConfig = new HashMap<String, String>();
+
+    private boolean eventsEnabled;
+    private long eventsExpiration;
+    private Set<String> eventsListeners = new HashSet<String>();
+    private List<String> defaultRoles = new LinkedList<String>();
+    private Map<String, String> realmRoles = new HashMap<String, String>();
+    private Map<String, String> applications = new HashMap<String, String>();
+    private Map<String, String> clients = new HashMap<String, String>();
+
+    public CachedRealm() {
+    }
+
+    public CachedRealm(RealmCache cache, RealmProvider delegate, RealmModel model) {
+        id = model.getId();
+        name = model.getName();
+        enabled = model.isEnabled();
+        sslRequired = model.getSslRequired();
+        registrationAllowed = model.isRegistrationAllowed();
+        registrationEmailAsUsername = model.isRegistrationEmailAsUsername();
+        rememberMe = model.isRememberMe();
+        verifyEmail = model.isVerifyEmail();
+        passwordCredentialGrantAllowed = model.isPasswordCredentialGrantAllowed();
+        resetPasswordAllowed = model.isResetPasswordAllowed();
+        identityFederationEnabled = model.isIdentityFederationEnabled();
+        // --- brute force settings
+        bruteForceProtected = model.isBruteForceProtected();
+        maxFailureWaitSeconds = model.getMaxFailureWaitSeconds();
+        minimumQuickLoginWaitSeconds = model.getMinimumQuickLoginWaitSeconds();
+        waitIncrementSeconds = model.getWaitIncrementSeconds();
+        quickLoginCheckMilliSeconds = model.getQuickLoginCheckMilliSeconds();
+        maxDeltaTimeSeconds = model.getMaxDeltaTimeSeconds();
+        failureFactor = model.getFailureFactor();
+        // --- end brute force settings
+
+        ssoSessionIdleTimeout = model.getSsoSessionIdleTimeout();
+        ssoSessionMaxLifespan = model.getSsoSessionMaxLifespan();
+        accessTokenLifespan = model.getAccessTokenLifespan();
+        accessCodeLifespan = model.getAccessCodeLifespan();
+        accessCodeLifespanUserAction = model.getAccessCodeLifespanUserAction();
+        accessCodeLifespanLogin = model.getAccessCodeLifespanLogin();
+        notBefore = model.getNotBefore();
+        passwordPolicy = model.getPasswordPolicy();
+
+        publicKeyPem = model.getPublicKeyPem();
+        privateKeyPem = model.getPrivateKeyPem();
+        certificatePem = model.getCertificatePem();
+        codeSecret = model.getCodeSecret();
+
+        loginTheme = model.getLoginTheme();
+        accountTheme = model.getAccountTheme();
+        adminTheme = model.getAdminTheme();
+        emailTheme = model.getEmailTheme();
+
+        requiredCredentials = model.getRequiredCredentials();
+        userFederationProviders = model.getUserFederationProviders();
+
+        this.identityProviders = new ArrayList<IdentityProviderModel>();
+
+        for (IdentityProviderModel identityProviderModel : model.getIdentityProviders()) {
+            this.identityProviders.add(new IdentityProviderModel(identityProviderModel));
+        }
+
+        smtpConfig.putAll(model.getSmtpConfig());
+        browserSecurityHeaders.putAll(model.getBrowserSecurityHeaders());
+
+        eventsEnabled = model.isEventsEnabled();
+        eventsExpiration = model.getEventsExpiration();
+        eventsListeners.addAll(model.getEventsListeners());
+        defaultRoles.addAll(model.getDefaultRoles());
+        masterAdminApp = model.getMasterAdminApp().getId();
+
+        for (RoleModel role : model.getRoles()) {
+            realmRoles.put(role.getName(), role.getId());
+            CachedRole cachedRole = new CachedRealmRole(role, model);
+            cache.addCachedRole(cachedRole);
+        }
+
+        for (ApplicationModel app : model.getApplications()) {
+            applications.put(app.getName(), app.getId());
+            CachedApplication cachedApp = new CachedApplication(cache, delegate, model, app);
+            cache.addCachedApplication(cachedApp);
+        }
+
+        for (OAuthClientModel client : model.getOAuthClients()) {
+            clients.put(client.getClientId(), client.getId());
+            CachedOAuthClient cachedApp = new CachedOAuthClient(cache, delegate, model, client);
+            cache.addCachedOAuthClient(cachedApp);
+        }
+
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public String getMasterAdminApp() {
+        return masterAdminApp;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public List<String> getDefaultRoles() {
+        return defaultRoles;
+    }
+
+    public Map<String, String> getRealmRoles() {
+        return realmRoles;
+    }
+
+    public Map<String, String> getApplications() {
+        return applications;
+    }
+
+    public Map<String, String> getClients() {
+        return clients;
+    }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public SslRequired getSslRequired() {
+        return sslRequired;
+    }
+
+    public boolean isRegistrationAllowed() {
+        return registrationAllowed;
+    }
+
+    public boolean isRegistrationEmailAsUsername() {
+        return registrationEmailAsUsername;
+    }
+
+    public boolean isPasswordCredentialGrantAllowed() {
+        return passwordCredentialGrantAllowed;
+    }
+
+    public boolean isRememberMe() {
+        return this.rememberMe;
+    }
 
-	public boolean isBruteForceProtected() {
-		return bruteForceProtected;
-	}
+    public boolean isBruteForceProtected() {
+        return bruteForceProtected;
+    }
 
-	public int getMaxFailureWaitSeconds() {
-		return this.maxFailureWaitSeconds;
-	}
+    public int getMaxFailureWaitSeconds() {
+        return this.maxFailureWaitSeconds;
+    }
 
-	public int getWaitIncrementSeconds() {
-		return this.waitIncrementSeconds;
-	}
+    public int getWaitIncrementSeconds() {
+        return this.waitIncrementSeconds;
+    }
 
-	public int getMinimumQuickLoginWaitSeconds() {
-		return this.minimumQuickLoginWaitSeconds;
-	}
-
-	public long getQuickLoginCheckMilliSeconds() {
-		return quickLoginCheckMilliSeconds;
-	}
-
-	public int getMaxDeltaTimeSeconds() {
-		return maxDeltaTimeSeconds;
-	}
-
-	public int getFailureFactor() {
-		return failureFactor;
-	}
+    public int getMinimumQuickLoginWaitSeconds() {
+        return this.minimumQuickLoginWaitSeconds;
+    }
+
+    public long getQuickLoginCheckMilliSeconds() {
+        return quickLoginCheckMilliSeconds;
+    }
+
+    public int getMaxDeltaTimeSeconds() {
+        return maxDeltaTimeSeconds;
+    }
+
+    public int getFailureFactor() {
+        return failureFactor;
+    }
 
-	public boolean isVerifyEmail() {
-		return verifyEmail;
-	}
+    public boolean isVerifyEmail() {
+        return verifyEmail;
+    }
 
-	public boolean isResetPasswordAllowed() {
-		return resetPasswordAllowed;
-	}
-
-	public int getSsoSessionIdleTimeout() {
-		return ssoSessionIdleTimeout;
-	}
+    public boolean isResetPasswordAllowed() {
+        return resetPasswordAllowed;
+    }
+
+    public int getSsoSessionIdleTimeout() {
+        return ssoSessionIdleTimeout;
+    }
 
-	public int getSsoSessionMaxLifespan() {
-		return ssoSessionMaxLifespan;
-	}
+    public int getSsoSessionMaxLifespan() {
+        return ssoSessionMaxLifespan;
+    }
 
-	public int getAccessTokenLifespan() {
-		return accessTokenLifespan;
-	}
+    public int getAccessTokenLifespan() {
+        return accessTokenLifespan;
+    }
 
-	public int getAccessCodeLifespan() {
-		return accessCodeLifespan;
-	}
+    public int getAccessCodeLifespan() {
+        return accessCodeLifespan;
+    }
 
-	public int getAccessCodeLifespanUserAction() {
-		return accessCodeLifespanUserAction;
-	}
+    public int getAccessCodeLifespanUserAction() {
+        return accessCodeLifespanUserAction;
+    }
 
-	public int getAccessCodeLifespanLogin() {
-		return accessCodeLifespanLogin;
-	}
+    public int getAccessCodeLifespanLogin() {
+        return accessCodeLifespanLogin;
+    }
 
-	public String getPublicKeyPem() {
-		return publicKeyPem;
-	}
+    public String getPublicKeyPem() {
+        return publicKeyPem;
+    }
 
-	public String getPrivateKeyPem() {
-		return privateKeyPem;
-	}
+    public String getPrivateKeyPem() {
+        return privateKeyPem;
+    }
 
-	public String getCodeSecret() {
-		return codeSecret;
-	}
+    public String getCodeSecret() {
+        return codeSecret;
+    }
 
-	public List<RequiredCredentialModel> getRequiredCredentials() {
-		return requiredCredentials;
-	}
+    public List<RequiredCredentialModel> getRequiredCredentials() {
+        return requiredCredentials;
+    }
 
-	public PasswordPolicy getPasswordPolicy() {
-		return passwordPolicy;
-	}
+    public PasswordPolicy getPasswordPolicy() {
+        return passwordPolicy;
+    }
 
-	public boolean isIdentityFederationEnabled() {
-		return identityFederationEnabled;
-	}
+    public boolean isIdentityFederationEnabled() {
+        return identityFederationEnabled;
+    }
 
-	public Map<String, String> getSmtpConfig() {
-		return smtpConfig;
-	}
+    public Map<String, String> getSmtpConfig() {
+        return smtpConfig;
+    }
 
-	public Map<String, String> getBrowserSecurityHeaders() {
-		return browserSecurityHeaders;
-	}
+    public Map<String, String> getBrowserSecurityHeaders() {
+        return browserSecurityHeaders;
+    }
 
-	public String getLoginTheme() {
-		return loginTheme;
-	}
+    public String getLoginTheme() {
+        return loginTheme;
+    }
 
-	public String getAccountTheme() {
-		return accountTheme;
-	}
+    public String getAccountTheme() {
+        return accountTheme;
+    }
 
-	public String getAdminTheme() {
-		return this.adminTheme;
-	}
+    public String getAdminTheme() {
+        return this.adminTheme;
+    }
 
-	public String getEmailTheme() {
-		return emailTheme;
-	}
+    public String getEmailTheme() {
+        return emailTheme;
+    }
 
-	public int getNotBefore() {
-		return notBefore;
-	}
+    public int getNotBefore() {
+        return notBefore;
+    }
 
-	public boolean isEventsEnabled() {
-		return eventsEnabled;
-	}
+    public boolean isEventsEnabled() {
+        return eventsEnabled;
+    }
 
-	public long getEventsExpiration() {
-		return eventsExpiration;
-	}
+    public long getEventsExpiration() {
+        return eventsExpiration;
+    }
 
-	public Set<String> getEventsListeners() {
-		return eventsListeners;
-	}
+    public Set<String> getEventsListeners() {
+        return eventsListeners;
+    }
 
-	public List<UserFederationProviderModel> getUserFederationProviders() {
-		return userFederationProviders;
-	}
+    public List<UserFederationProviderModel> getUserFederationProviders() {
+        return userFederationProviders;
+    }
 
-	public String getCertificatePem() {
-		return certificatePem;
-	}
+    public String getCertificatePem() {
+        return certificatePem;
+    }
 
-	public List<IdentityProviderModel> getIdentityProviders() {
-		return identityProviders;
-	}
+    public List<IdentityProviderModel> getIdentityProviders() {
+        return identityProviders;
+    }
 }
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmAdapter.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmAdapter.java
index 070f5b0..a864aa1 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmAdapter.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmAdapter.java
@@ -30,925 +30,925 @@ import org.keycloak.models.utils.KeycloakModelUtils;
  * @version $Revision: 1 $
  */
 public class RealmAdapter implements RealmModel {
-	protected CachedRealm cached;
-	protected CacheRealmProvider cacheSession;
-	protected RealmModel updated;
-	protected RealmCache cache;
-	protected volatile transient PublicKey publicKey;
-	protected volatile transient PrivateKey privateKey;
-	protected volatile transient Key codeSecretKey;
-	protected volatile transient X509Certificate certificate;
-
-	public RealmAdapter(CachedRealm cached, CacheRealmProvider cacheSession) {
-		this.cached = cached;
-		this.cacheSession = cacheSession;
-	}
-
-	protected void getDelegateForUpdate() {
-		if (updated == null) {
-			cacheSession.registerRealmInvalidation(getId());
-			updated = cacheSession.getDelegate().getRealm(getId());
-			if (updated == null)
-				throw new IllegalStateException("Not found in database");
-		}
-	}
-
-	@Override
-	public String getId() {
-		if (updated != null)
-			return updated.getId();
-		return cached.getId();
-	}
-
-	@Override
-	public String getName() {
-		if (updated != null)
-			return updated.getName();
-		return cached.getName();
-	}
-
-	@Override
-	public void setName(String name) {
-		getDelegateForUpdate();
-		updated.setName(name);
-	}
-
-	@Override
-	public boolean isEnabled() {
-		if (updated != null)
-			return updated.isEnabled();
-		return cached.isEnabled();
-	}
-
-	@Override
-	public void setEnabled(boolean enabled) {
-		getDelegateForUpdate();
-		updated.setEnabled(enabled);
-	}
-
-	@Override
-	public SslRequired getSslRequired() {
-		if (updated != null)
-			return updated.getSslRequired();
-		return cached.getSslRequired();
-	}
-
-	@Override
-	public void setSslRequired(SslRequired sslRequired) {
-		getDelegateForUpdate();
-		updated.setSslRequired(sslRequired);
-	}
-
-	@Override
-	public boolean isRegistrationAllowed() {
-		if (updated != null)
-			return updated.isRegistrationAllowed();
-		return cached.isRegistrationAllowed();
-	}
-
-	@Override
-	public void setRegistrationAllowed(boolean registrationAllowed) {
-		getDelegateForUpdate();
-		updated.setRegistrationAllowed(registrationAllowed);
-	}
-
-	@Override
-	public boolean isRegistrationEmailAsUsername() {
-		if (updated != null)
-			return updated.isRegistrationEmailAsUsername();
-		return cached.isRegistrationEmailAsUsername();
-	}
-
-	@Override
-	public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
-		getDelegateForUpdate();
-		updated.setRegistrationEmailAsUsername(registrationEmailAsUsername);
-	}
-
-	@Override
-	public boolean isPasswordCredentialGrantAllowed() {
-		if (updated != null)
-			return updated.isPasswordCredentialGrantAllowed();
-		return cached.isPasswordCredentialGrantAllowed();
-	}
-
-	@Override
-	public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
-		getDelegateForUpdate();
-		updated.setPasswordCredentialGrantAllowed(passwordCredentialGrantAllowed);
-	}
-
-	@Override
-	public boolean isRememberMe() {
-		if (updated != null)
-			return updated.isRememberMe();
-		return cached.isRememberMe();
-	}
-
-	@Override
-	public void setRememberMe(boolean rememberMe) {
-		getDelegateForUpdate();
-		updated.setRememberMe(rememberMe);
-	}
-
-	@Override
-	public boolean isBruteForceProtected() {
-		if (updated != null)
-			return updated.isBruteForceProtected();
-		return cached.isBruteForceProtected();
-	}
-
-	@Override
-	public void setBruteForceProtected(boolean value) {
-		getDelegateForUpdate();
-		updated.setBruteForceProtected(value);
-	}
-
-	@Override
-	public int getMaxFailureWaitSeconds() {
-		if (updated != null)
-			return updated.getMaxFailureWaitSeconds();
-		return cached.getMaxFailureWaitSeconds();
-	}
-
-	@Override
-	public void setMaxFailureWaitSeconds(int val) {
-		getDelegateForUpdate();
-		updated.setMaxFailureWaitSeconds(val);
-	}
-
-	@Override
-	public int getWaitIncrementSeconds() {
-		if (updated != null)
-			return updated.getWaitIncrementSeconds();
-		return cached.getWaitIncrementSeconds();
-	}
-
-	@Override
-	public void setWaitIncrementSeconds(int val) {
-		getDelegateForUpdate();
-		updated.setWaitIncrementSeconds(val);
-	}
-
-	@Override
-	public int getMinimumQuickLoginWaitSeconds() {
-		if (updated != null)
-			return updated.getMinimumQuickLoginWaitSeconds();
-		return cached.getMinimumQuickLoginWaitSeconds();
-	}
-
-	@Override
-	public void setMinimumQuickLoginWaitSeconds(int val) {
-		getDelegateForUpdate();
-		updated.setMinimumQuickLoginWaitSeconds(val);
-	}
-
-	@Override
-	public long getQuickLoginCheckMilliSeconds() {
-		if (updated != null)
-			return updated.getQuickLoginCheckMilliSeconds();
-		return cached.getQuickLoginCheckMilliSeconds();
-	}
-
-	@Override
-	public void setQuickLoginCheckMilliSeconds(long val) {
-		getDelegateForUpdate();
-		updated.setQuickLoginCheckMilliSeconds(val);
-	}
-
-	@Override
-	public int getMaxDeltaTimeSeconds() {
-		if (updated != null)
-			return updated.getMaxDeltaTimeSeconds();
-		return cached.getMaxDeltaTimeSeconds();
-	}
-
-	@Override
-	public void setMaxDeltaTimeSeconds(int val) {
-		getDelegateForUpdate();
-		updated.setMaxDeltaTimeSeconds(val);
-	}
-
-	@Override
-	public int getFailureFactor() {
-		if (updated != null)
-			return updated.getFailureFactor();
-		return cached.getFailureFactor();
-	}
-
-	@Override
-	public void setFailureFactor(int failureFactor) {
-		getDelegateForUpdate();
-		updated.setFailureFactor(failureFactor);
-	}
-
-	@Override
-	public boolean isVerifyEmail() {
-		if (updated != null)
-			return updated.isVerifyEmail();
-		return cached.isVerifyEmail();
-	}
-
-	@Override
-	public void setVerifyEmail(boolean verifyEmail) {
-		getDelegateForUpdate();
-		updated.setVerifyEmail(verifyEmail);
-	}
-
-	@Override
-	public boolean isResetPasswordAllowed() {
-		if (updated != null)
-			return updated.isResetPasswordAllowed();
-		return cached.isResetPasswordAllowed();
-	}
-
-	@Override
-	public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
-		getDelegateForUpdate();
-		updated.setResetPasswordAllowed(resetPasswordAllowed);
-	}
-
-	@Override
-	public int getSsoSessionIdleTimeout() {
-		if (updated != null)
-			return updated.getSsoSessionIdleTimeout();
-		return cached.getSsoSessionIdleTimeout();
-	}
-
-	@Override
-	public void setSsoSessionIdleTimeout(int seconds) {
-		getDelegateForUpdate();
-		updated.setSsoSessionIdleTimeout(seconds);
-	}
-
-	@Override
-	public int getSsoSessionMaxLifespan() {
-		if (updated != null)
-			return updated.getSsoSessionMaxLifespan();
-		return cached.getSsoSessionMaxLifespan();
-	}
-
-	@Override
-	public void setSsoSessionMaxLifespan(int seconds) {
-		getDelegateForUpdate();
-		updated.setSsoSessionMaxLifespan(seconds);
-	}
-
-	@Override
-	public int getAccessTokenLifespan() {
-		if (updated != null)
-			return updated.getAccessTokenLifespan();
-		return cached.getAccessTokenLifespan();
-	}
-
-	@Override
-	public void setAccessTokenLifespan(int seconds) {
-		getDelegateForUpdate();
-		updated.setAccessTokenLifespan(seconds);
-	}
-
-	@Override
-	public int getAccessCodeLifespan() {
-		if (updated != null)
-			return updated.getAccessCodeLifespan();
-		return cached.getAccessCodeLifespan();
-	}
-
-	@Override
-	public void setAccessCodeLifespan(int seconds) {
-		getDelegateForUpdate();
-		updated.setAccessCodeLifespan(seconds);
-	}
-
-	@Override
-	public int getAccessCodeLifespanUserAction() {
-		if (updated != null)
-			return updated.getAccessCodeLifespanUserAction();
-		return cached.getAccessCodeLifespanUserAction();
-	}
-
-	@Override
-	public void setAccessCodeLifespanUserAction(int seconds) {
-		getDelegateForUpdate();
-		updated.setAccessCodeLifespanUserAction(seconds);
-	}
-
-	@Override
-	public int getAccessCodeLifespanLogin() {
-		if (updated != null)
-			return updated.getAccessCodeLifespanLogin();
-		return cached.getAccessCodeLifespanLogin();
-	}
-
-	@Override
-	public void setAccessCodeLifespanLogin(int seconds) {
-		getDelegateForUpdate();
-		updated.setAccessCodeLifespanLogin(seconds);
-	}
-
-	@Override
-	public String getPublicKeyPem() {
-		if (updated != null)
-			return updated.getPublicKeyPem();
-		return cached.getPublicKeyPem();
-	}
-
-	@Override
-	public void setPublicKeyPem(String publicKeyPem) {
-		getDelegateForUpdate();
-		updated.setPublicKeyPem(publicKeyPem);
-	}
-
-	@Override
-	public String getPrivateKeyPem() {
-		if (updated != null)
-			return updated.getPrivateKeyPem();
-		return cached.getPrivateKeyPem();
-	}
-
-	@Override
-	public void setPrivateKeyPem(String privateKeyPem) {
-		getDelegateForUpdate();
-		updated.setPrivateKeyPem(privateKeyPem);
-	}
-
-	@Override
-	public PublicKey getPublicKey() {
-		if (publicKey != null)
-			return publicKey;
-		publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
-		return publicKey;
-	}
-
-	@Override
-	public void setPublicKey(PublicKey publicKey) {
-		this.publicKey = publicKey;
-		String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
-		setPublicKeyPem(publicKeyPem);
-	}
-
-	@Override
-	public X509Certificate getCertificate() {
-		if (certificate != null)
-			return certificate;
-		certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
-		return certificate;
-	}
-
-	@Override
-	public void setCertificate(X509Certificate certificate) {
-		this.certificate = certificate;
-		String certPem = KeycloakModelUtils.getPemFromCertificate(certificate);
-		setCertificatePem(certPem);
-	}
-
-	@Override
-	public String getCertificatePem() {
-		if (updated != null)
-			return updated.getCertificatePem();
-		return cached.getCertificatePem();
-	}
-
-	@Override
-	public void setCertificatePem(String certificate) {
-		getDelegateForUpdate();
-		updated.setCertificatePem(certificate);
-
-	}
-
-	@Override
-	public PrivateKey getPrivateKey() {
-		if (privateKey != null)
-			return privateKey;
-		privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
-		return privateKey;
-	}
-
-	@Override
-	public void setPrivateKey(PrivateKey privateKey) {
-		this.privateKey = privateKey;
-		String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
-		setPrivateKeyPem(privateKeyPem);
-	}
-
-	@Override
-	public String getCodeSecret() {
-		return updated != null ? updated.getCodeSecret() : cached.getCodeSecret();
-	}
-
-	@Override
-	public Key getCodeSecretKey() {
-		if (codeSecretKey == null) {
-			codeSecretKey = KeycloakModelUtils.getSecretKey(getCodeSecret());
-		}
-		return codeSecretKey;
-	}
-
-	@Override
-	public void setCodeSecret(String codeSecret) {
-		getDelegateForUpdate();
-		updated.setCodeSecret(codeSecret);
-	}
-
-	@Override
-	public List<RequiredCredentialModel> getRequiredCredentials() {
-
-		List<RequiredCredentialModel> copy = new LinkedList<RequiredCredentialModel>();
-		if (updated != null)
-			copy.addAll(updated.getRequiredCredentials());
-		else
-			copy.addAll(cached.getRequiredCredentials());
-		return copy;
-	}
-
-	@Override
-	public void addRequiredCredential(String cred) {
-		getDelegateForUpdate();
-		updated.addRequiredCredential(cred);
-	}
-
-	@Override
-	public PasswordPolicy getPasswordPolicy() {
-		if (updated != null)
-			return updated.getPasswordPolicy();
-		return cached.getPasswordPolicy();
-	}
-
-	@Override
-	public void setPasswordPolicy(PasswordPolicy policy) {
-		getDelegateForUpdate();
-		updated.setPasswordPolicy(policy);
-	}
-
-	@Override
-	public RoleModel getRoleById(String id) {
-		if (updated != null)
-			return updated.getRoleById(id);
-		return cacheSession.getRoleById(id, this);
-	}
-
-	@Override
-	public List<String> getDefaultRoles() {
-		if (updated != null)
-			return updated.getDefaultRoles();
-		return cached.getDefaultRoles();
-	}
-
-	@Override
-	public void addDefaultRole(String name) {
-		getDelegateForUpdate();
-		updated.addDefaultRole(name);
-	}
-
-	@Override
-	public void updateDefaultRoles(String[] defaultRoles) {
-		getDelegateForUpdate();
-		updated.updateDefaultRoles(defaultRoles);
-	}
-
-	@Override
-	public ClientModel findClient(String clientId) {
-		if (updated != null)
-			return updated.findClient(clientId);
-		String appId = cached.getApplications().get(clientId);
-		if (appId != null) {
-			return cacheSession.getApplicationById(appId, this);
-		}
-		String oauth = cached.getClients().get(clientId);
-		if (oauth != null) {
-			return cacheSession.getOAuthClientById(oauth, this);
-		}
-		return null;
-	}
-
-	@Override
-	public Map<String, ApplicationModel> getApplicationNameMap() {
-		if (updated != null)
-			return updated.getApplicationNameMap();
-		Map<String, ApplicationModel> map = new HashMap<String, ApplicationModel>();
-		for (String id : cached.getApplications().values()) {
-			ApplicationModel model = cacheSession.getApplicationById(id, this);
-			if (model == null) {
-				throw new IllegalStateException("Cached application not found: " + id);
-			}
-			map.put(model.getName(), model);
-		}
-		return map;
-	}
-
-	@Override
-	public List<ApplicationModel> getApplications() {
-		if (updated != null)
-			return updated.getApplications();
-		List<ApplicationModel> apps = new LinkedList<ApplicationModel>();
-		for (String id : cached.getApplications().values()) {
-			ApplicationModel model = cacheSession.getApplicationById(id, this);
-			if (model == null) {
-				throw new IllegalStateException("Cached application not found: " + id);
-			}
-			apps.add(model);
-		}
-		return apps;
-
-	}
-
-	@Override
-	public ApplicationModel addApplication(String name) {
-		getDelegateForUpdate();
-		ApplicationModel app = updated.addApplication(name);
-		cacheSession.registerApplicationInvalidation(app.getId());
-		return app;
-	}
-
-	@Override
-	public ApplicationModel addApplication(String id, String name) {
-		getDelegateForUpdate();
-		ApplicationModel app = updated.addApplication(id, name);
-		cacheSession.registerApplicationInvalidation(app.getId());
-		return app;
-	}
-
-	@Override
-	public boolean removeApplication(String id) {
-		cacheSession.registerApplicationInvalidation(id);
-		getDelegateForUpdate();
-		return updated.removeApplication(id);
-	}
-
-	@Override
-	public ApplicationModel getApplicationById(String id) {
-		if (updated != null)
-			return updated.getApplicationById(id);
-		return cacheSession.getApplicationById(id, this);
-	}
-
-	@Override
-	public ApplicationModel getApplicationByName(String name) {
-		if (updated != null)
-			return updated.getApplicationByName(name);
-		String id = cached.getApplications().get(name);
-		if (id == null)
-			return null;
-		return getApplicationById(id);
-	}
-
-	@Override
-	public void updateRequiredCredentials(Set<String> creds) {
-		getDelegateForUpdate();
-		updated.updateRequiredCredentials(creds);
-	}
-
-	@Override
-	public OAuthClientModel addOAuthClient(String name) {
-		getDelegateForUpdate();
-		OAuthClientModel client = updated.addOAuthClient(name);
-		cacheSession.registerOAuthClientInvalidation(client.getId());
-		return client;
-	}
-
-	@Override
-	public OAuthClientModel addOAuthClient(String id, String name) {
-		getDelegateForUpdate();
-		OAuthClientModel client = updated.addOAuthClient(id, name);
-		cacheSession.registerOAuthClientInvalidation(client.getId());
-		return client;
-	}
-
-	@Override
-	public OAuthClientModel getOAuthClient(String name) {
-		if (updated != null)
-			return updated.getOAuthClient(name);
-		String id = cached.getClients().get(name);
-		if (id == null)
-			return null;
-		return getOAuthClientById(id);
-	}
-
-	@Override
-	public OAuthClientModel getOAuthClientById(String id) {
-		if (updated != null)
-			return updated.getOAuthClientById(id);
-		return cacheSession.getOAuthClientById(id, this);
-	}
-
-	@Override
-	public boolean removeOAuthClient(String id) {
-		cacheSession.registerOAuthClientInvalidation(id);
-		getDelegateForUpdate();
-		return updated.removeOAuthClient(id);
-	}
-
-	@Override
-	public List<OAuthClientModel> getOAuthClients() {
-		if (updated != null)
-			return updated.getOAuthClients();
-		List<OAuthClientModel> clients = new LinkedList<OAuthClientModel>();
-		for (String id : cached.getClients().values()) {
-			OAuthClientModel model = cacheSession.getOAuthClientById(id, this);
-			if (model == null) {
-				throw new IllegalStateException("Cached oauth client not found: " + id);
-			}
-			clients.add(model);
-		}
-		return clients;
-	}
-
-	@Override
-	public Map<String, String> getBrowserSecurityHeaders() {
-		if (updated != null)
-			return updated.getBrowserSecurityHeaders();
-		return cached.getBrowserSecurityHeaders();
-	}
-
-	@Override
-	public void setBrowserSecurityHeaders(Map<String, String> headers) {
-		getDelegateForUpdate();
-		updated.setBrowserSecurityHeaders(headers);
-
-	}
-
-	@Override
-	public Map<String, String> getSmtpConfig() {
-		if (updated != null)
-			return updated.getSmtpConfig();
-		return cached.getSmtpConfig();
-	}
-
-	@Override
-	public void setSmtpConfig(Map<String, String> smtpConfig) {
-		getDelegateForUpdate();
-		updated.setSmtpConfig(smtpConfig);
-	}
-
-	@Override
-	public List<IdentityProviderModel> getIdentityProviders() {
-		if (updated != null)
-			return updated.getIdentityProviders();
-		return cached.getIdentityProviders();
-	}
-
-	@Override
-	public IdentityProviderModel getIdentityProviderById(String identityProviderId) {
-		for (IdentityProviderModel identityProviderModel : getIdentityProviders()) {
-			if (identityProviderModel.getId().equals(identityProviderId)) {
-				return identityProviderModel;
-			}
-		}
-
-		return null;
-	}
-
-	@Override
-	public void addIdentityProvider(IdentityProviderModel identityProvider) {
-		getDelegateForUpdate();
-		updated.addIdentityProvider(identityProvider);
-	}
-
-	@Override
-	public void updateIdentityProvider(IdentityProviderModel identityProvider) {
-		getDelegateForUpdate();
-		updated.updateIdentityProvider(identityProvider);
-	}
-
-	@Override
-	public void removeIdentityProviderById(String providerId) {
-		getDelegateForUpdate();
-		updated.removeIdentityProviderById(providerId);
-	}
-
-	@Override
-	public List<UserFederationProviderModel> getUserFederationProviders() {
-		if (updated != null)
-			return updated.getUserFederationProviders();
-		return cached.getUserFederationProviders();
-	}
-
-	@Override
-	public void setUserFederationProviders(List<UserFederationProviderModel> providers) {
-		getDelegateForUpdate();
-		updated.setUserFederationProviders(providers);
-	}
-
-	@Override
-	public UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config,
-			int priority, String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync) {
-		getDelegateForUpdate();
-		return updated.addUserFederationProvider(providerName, config, priority, displayName, fullSyncPeriod,
-				changedSyncPeriod, lastSync);
-	}
-
-	@Override
-	public void removeUserFederationProvider(UserFederationProviderModel provider) {
-		getDelegateForUpdate();
-		updated.removeUserFederationProvider(provider);
-
-	}
-
-	@Override
-	public void updateUserFederationProvider(UserFederationProviderModel provider) {
-		getDelegateForUpdate();
-		updated.updateUserFederationProvider(provider);
-
-	}
-
-	@Override
-	public String getLoginTheme() {
-		if (updated != null)
-			return updated.getLoginTheme();
-		return cached.getLoginTheme();
-	}
-
-	@Override
-	public void setLoginTheme(String name) {
-		getDelegateForUpdate();
-		updated.setLoginTheme(name);
-	}
-
-	@Override
-	public String getAccountTheme() {
-		if (updated != null)
-			return updated.getAccountTheme();
-		return cached.getAccountTheme();
-	}
-
-	@Override
-	public void setAccountTheme(String name) {
-		getDelegateForUpdate();
-		updated.setAccountTheme(name);
-	}
-
-	@Override
-	public String getAdminTheme() {
-		if (updated != null)
-			return updated.getAdminTheme();
-		return cached.getAdminTheme();
-	}
-
-	@Override
-	public void setAdminTheme(String name) {
-		getDelegateForUpdate();
-		updated.setAdminTheme(name);
-	}
-
-	@Override
-	public String getEmailTheme() {
-		if (updated != null)
-			return updated.getEmailTheme();
-		return cached.getEmailTheme();
-	}
-
-	@Override
-	public void setEmailTheme(String name) {
-		getDelegateForUpdate();
-		updated.setEmailTheme(name);
-	}
-
-	@Override
-	public int getNotBefore() {
-		if (updated != null)
-			return updated.getNotBefore();
-		return cached.getNotBefore();
-	}
-
-	@Override
-	public void setNotBefore(int notBefore) {
-		getDelegateForUpdate();
-		updated.setNotBefore(notBefore);
-	}
-
-	@Override
-	public boolean removeRoleById(String id) {
-		cacheSession.registerRoleInvalidation(id);
-		getDelegateForUpdate();
-		return updated.removeRoleById(id);
-	}
-
-	@Override
-	public boolean isEventsEnabled() {
-		if (updated != null)
-			return updated.isEventsEnabled();
-		return cached.isEventsEnabled();
-	}
-
-	@Override
-	public void setEventsEnabled(boolean enabled) {
-		getDelegateForUpdate();
-		updated.setEventsEnabled(enabled);
-	}
-
-	@Override
-	public long getEventsExpiration() {
-		if (updated != null)
-			return updated.getEventsExpiration();
-		return cached.getEventsExpiration();
-	}
-
-	@Override
-	public void setEventsExpiration(long expiration) {
-		getDelegateForUpdate();
-		updated.setEventsExpiration(expiration);
-	}
-
-	@Override
-	public Set<String> getEventsListeners() {
-		if (updated != null)
-			return updated.getEventsListeners();
-		return cached.getEventsListeners();
-	}
-
-	@Override
-	public void setEventsListeners(Set<String> listeners) {
-		getDelegateForUpdate();
-		updated.setEventsListeners(listeners);
-	}
-
-	@Override
-	public ApplicationModel getMasterAdminApp() {
-		return cacheSession.getRealm(Config.getAdminRealm()).getApplicationById(cached.getMasterAdminApp());
-	}
-
-	@Override
-	public void setMasterAdminApp(ApplicationModel app) {
-		getDelegateForUpdate();
-		updated.setMasterAdminApp(app);
-	}
-
-	@Override
-	public RoleModel getRole(String name) {
-		if (updated != null)
-			return updated.getRole(name);
-		String id = cached.getRealmRoles().get(name);
-		if (id == null)
-			return null;
-		return cacheSession.getRoleById(id, this);
-	}
-
-	@Override
-	public RoleModel addRole(String name) {
-		getDelegateForUpdate();
-		RoleModel role = updated.addRole(name);
-		cacheSession.registerRoleInvalidation(role.getId());
-		return role;
-	}
-
-	@Override
-	public RoleModel addRole(String id, String name) {
-		getDelegateForUpdate();
-		RoleModel role = updated.addRole(id, name);
-		cacheSession.registerRoleInvalidation(role.getId());
-		return role;
-	}
-
-	@Override
-	public boolean removeRole(RoleModel role) {
-		cacheSession.registerRoleInvalidation(role.getId());
-		getDelegateForUpdate();
-		return updated.removeRole(role);
-	}
-
-	@Override
-	public Set<RoleModel> getRoles() {
-		if (updated != null)
-			return updated.getRoles();
-
-		Set<RoleModel> roles = new HashSet<RoleModel>();
-		for (String id : cached.getRealmRoles().values()) {
-			RoleModel roleById = cacheSession.getRoleById(id, this);
-			if (roleById == null)
-				continue;
-			roles.add(roleById);
-		}
-		return roles;
-	}
-
-	@Override
-	public ClientModel findClientById(String id) {
-		ClientModel model = getApplicationById(id);
-		if (model != null)
-			return model;
-		return getOAuthClientById(id);
-	}
-
-	@Override
-	public boolean isIdentityFederationEnabled() {
-		if (updated != null)
-			return updated.isIdentityFederationEnabled();
-		return cached.isIdentityFederationEnabled();
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if (this == o)
-			return true;
-		if (o == null || !(o instanceof RealmModel))
-			return false;
-
-		RealmModel that = (RealmModel) o;
-		return that.getId().equals(getId());
-	}
-
-	@Override
-	public int hashCode() {
-		return getId().hashCode();
-	}
+    protected CachedRealm cached;
+    protected CacheRealmProvider cacheSession;
+    protected RealmModel updated;
+    protected RealmCache cache;
+    protected volatile transient PublicKey publicKey;
+    protected volatile transient PrivateKey privateKey;
+    protected volatile transient Key codeSecretKey;
+    protected volatile transient X509Certificate certificate;
+
+    public RealmAdapter(CachedRealm cached, CacheRealmProvider cacheSession) {
+        this.cached = cached;
+        this.cacheSession = cacheSession;
+    }
+
+    protected void getDelegateForUpdate() {
+        if (updated == null) {
+            cacheSession.registerRealmInvalidation(getId());
+            updated = cacheSession.getDelegate().getRealm(getId());
+            if (updated == null)
+                throw new IllegalStateException("Not found in database");
+        }
+    }
+
+    @Override
+    public String getId() {
+        if (updated != null)
+            return updated.getId();
+        return cached.getId();
+    }
+
+    @Override
+    public String getName() {
+        if (updated != null)
+            return updated.getName();
+        return cached.getName();
+    }
+
+    @Override
+    public void setName(String name) {
+        getDelegateForUpdate();
+        updated.setName(name);
+    }
+
+    @Override
+    public boolean isEnabled() {
+        if (updated != null)
+            return updated.isEnabled();
+        return cached.isEnabled();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        getDelegateForUpdate();
+        updated.setEnabled(enabled);
+    }
+
+    @Override
+    public SslRequired getSslRequired() {
+        if (updated != null)
+            return updated.getSslRequired();
+        return cached.getSslRequired();
+    }
+
+    @Override
+    public void setSslRequired(SslRequired sslRequired) {
+        getDelegateForUpdate();
+        updated.setSslRequired(sslRequired);
+    }
+
+    @Override
+    public boolean isRegistrationAllowed() {
+        if (updated != null)
+            return updated.isRegistrationAllowed();
+        return cached.isRegistrationAllowed();
+    }
+
+    @Override
+    public void setRegistrationAllowed(boolean registrationAllowed) {
+        getDelegateForUpdate();
+        updated.setRegistrationAllowed(registrationAllowed);
+    }
+
+    @Override
+    public boolean isRegistrationEmailAsUsername() {
+        if (updated != null)
+            return updated.isRegistrationEmailAsUsername();
+        return cached.isRegistrationEmailAsUsername();
+    }
+
+    @Override
+    public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
+        getDelegateForUpdate();
+        updated.setRegistrationEmailAsUsername(registrationEmailAsUsername);
+    }
+
+    @Override
+    public boolean isPasswordCredentialGrantAllowed() {
+        if (updated != null)
+            return updated.isPasswordCredentialGrantAllowed();
+        return cached.isPasswordCredentialGrantAllowed();
+    }
+
+    @Override
+    public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
+        getDelegateForUpdate();
+        updated.setPasswordCredentialGrantAllowed(passwordCredentialGrantAllowed);
+    }
+
+    @Override
+    public boolean isRememberMe() {
+        if (updated != null)
+            return updated.isRememberMe();
+        return cached.isRememberMe();
+    }
+
+    @Override
+    public void setRememberMe(boolean rememberMe) {
+        getDelegateForUpdate();
+        updated.setRememberMe(rememberMe);
+    }
+
+    @Override
+    public boolean isBruteForceProtected() {
+        if (updated != null)
+            return updated.isBruteForceProtected();
+        return cached.isBruteForceProtected();
+    }
+
+    @Override
+    public void setBruteForceProtected(boolean value) {
+        getDelegateForUpdate();
+        updated.setBruteForceProtected(value);
+    }
+
+    @Override
+    public int getMaxFailureWaitSeconds() {
+        if (updated != null)
+            return updated.getMaxFailureWaitSeconds();
+        return cached.getMaxFailureWaitSeconds();
+    }
+
+    @Override
+    public void setMaxFailureWaitSeconds(int val) {
+        getDelegateForUpdate();
+        updated.setMaxFailureWaitSeconds(val);
+    }
+
+    @Override
+    public int getWaitIncrementSeconds() {
+        if (updated != null)
+            return updated.getWaitIncrementSeconds();
+        return cached.getWaitIncrementSeconds();
+    }
+
+    @Override
+    public void setWaitIncrementSeconds(int val) {
+        getDelegateForUpdate();
+        updated.setWaitIncrementSeconds(val);
+    }
+
+    @Override
+    public int getMinimumQuickLoginWaitSeconds() {
+        if (updated != null)
+            return updated.getMinimumQuickLoginWaitSeconds();
+        return cached.getMinimumQuickLoginWaitSeconds();
+    }
+
+    @Override
+    public void setMinimumQuickLoginWaitSeconds(int val) {
+        getDelegateForUpdate();
+        updated.setMinimumQuickLoginWaitSeconds(val);
+    }
+
+    @Override
+    public long getQuickLoginCheckMilliSeconds() {
+        if (updated != null)
+            return updated.getQuickLoginCheckMilliSeconds();
+        return cached.getQuickLoginCheckMilliSeconds();
+    }
+
+    @Override
+    public void setQuickLoginCheckMilliSeconds(long val) {
+        getDelegateForUpdate();
+        updated.setQuickLoginCheckMilliSeconds(val);
+    }
+
+    @Override
+    public int getMaxDeltaTimeSeconds() {
+        if (updated != null)
+            return updated.getMaxDeltaTimeSeconds();
+        return cached.getMaxDeltaTimeSeconds();
+    }
+
+    @Override
+    public void setMaxDeltaTimeSeconds(int val) {
+        getDelegateForUpdate();
+        updated.setMaxDeltaTimeSeconds(val);
+    }
+
+    @Override
+    public int getFailureFactor() {
+        if (updated != null)
+            return updated.getFailureFactor();
+        return cached.getFailureFactor();
+    }
+
+    @Override
+    public void setFailureFactor(int failureFactor) {
+        getDelegateForUpdate();
+        updated.setFailureFactor(failureFactor);
+    }
+
+    @Override
+    public boolean isVerifyEmail() {
+        if (updated != null)
+            return updated.isVerifyEmail();
+        return cached.isVerifyEmail();
+    }
+
+    @Override
+    public void setVerifyEmail(boolean verifyEmail) {
+        getDelegateForUpdate();
+        updated.setVerifyEmail(verifyEmail);
+    }
+
+    @Override
+    public boolean isResetPasswordAllowed() {
+        if (updated != null)
+            return updated.isResetPasswordAllowed();
+        return cached.isResetPasswordAllowed();
+    }
+
+    @Override
+    public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
+        getDelegateForUpdate();
+        updated.setResetPasswordAllowed(resetPasswordAllowed);
+    }
+
+    @Override
+    public int getSsoSessionIdleTimeout() {
+        if (updated != null)
+            return updated.getSsoSessionIdleTimeout();
+        return cached.getSsoSessionIdleTimeout();
+    }
+
+    @Override
+    public void setSsoSessionIdleTimeout(int seconds) {
+        getDelegateForUpdate();
+        updated.setSsoSessionIdleTimeout(seconds);
+    }
+
+    @Override
+    public int getSsoSessionMaxLifespan() {
+        if (updated != null)
+            return updated.getSsoSessionMaxLifespan();
+        return cached.getSsoSessionMaxLifespan();
+    }
+
+    @Override
+    public void setSsoSessionMaxLifespan(int seconds) {
+        getDelegateForUpdate();
+        updated.setSsoSessionMaxLifespan(seconds);
+    }
+
+    @Override
+    public int getAccessTokenLifespan() {
+        if (updated != null)
+            return updated.getAccessTokenLifespan();
+        return cached.getAccessTokenLifespan();
+    }
+
+    @Override
+    public void setAccessTokenLifespan(int seconds) {
+        getDelegateForUpdate();
+        updated.setAccessTokenLifespan(seconds);
+    }
+
+    @Override
+    public int getAccessCodeLifespan() {
+        if (updated != null)
+            return updated.getAccessCodeLifespan();
+        return cached.getAccessCodeLifespan();
+    }
+
+    @Override
+    public void setAccessCodeLifespan(int seconds) {
+        getDelegateForUpdate();
+        updated.setAccessCodeLifespan(seconds);
+    }
+
+    @Override
+    public int getAccessCodeLifespanUserAction() {
+        if (updated != null)
+            return updated.getAccessCodeLifespanUserAction();
+        return cached.getAccessCodeLifespanUserAction();
+    }
+
+    @Override
+    public void setAccessCodeLifespanUserAction(int seconds) {
+        getDelegateForUpdate();
+        updated.setAccessCodeLifespanUserAction(seconds);
+    }
+
+    @Override
+    public int getAccessCodeLifespanLogin() {
+        if (updated != null)
+            return updated.getAccessCodeLifespanLogin();
+        return cached.getAccessCodeLifespanLogin();
+    }
+
+    @Override
+    public void setAccessCodeLifespanLogin(int seconds) {
+        getDelegateForUpdate();
+        updated.setAccessCodeLifespanLogin(seconds);
+    }
+
+    @Override
+    public String getPublicKeyPem() {
+        if (updated != null)
+            return updated.getPublicKeyPem();
+        return cached.getPublicKeyPem();
+    }
+
+    @Override
+    public void setPublicKeyPem(String publicKeyPem) {
+        getDelegateForUpdate();
+        updated.setPublicKeyPem(publicKeyPem);
+    }
+
+    @Override
+    public String getPrivateKeyPem() {
+        if (updated != null)
+            return updated.getPrivateKeyPem();
+        return cached.getPrivateKeyPem();
+    }
+
+    @Override
+    public void setPrivateKeyPem(String privateKeyPem) {
+        getDelegateForUpdate();
+        updated.setPrivateKeyPem(privateKeyPem);
+    }
+
+    @Override
+    public PublicKey getPublicKey() {
+        if (publicKey != null)
+            return publicKey;
+        publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
+        return publicKey;
+    }
+
+    @Override
+    public void setPublicKey(PublicKey publicKey) {
+        this.publicKey = publicKey;
+        String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
+        setPublicKeyPem(publicKeyPem);
+    }
+
+    @Override
+    public X509Certificate getCertificate() {
+        if (certificate != null)
+            return certificate;
+        certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
+        return certificate;
+    }
+
+    @Override
+    public void setCertificate(X509Certificate certificate) {
+        this.certificate = certificate;
+        String certPem = KeycloakModelUtils.getPemFromCertificate(certificate);
+        setCertificatePem(certPem);
+    }
+
+    @Override
+    public String getCertificatePem() {
+        if (updated != null)
+            return updated.getCertificatePem();
+        return cached.getCertificatePem();
+    }
+
+    @Override
+    public void setCertificatePem(String certificate) {
+        getDelegateForUpdate();
+        updated.setCertificatePem(certificate);
+
+    }
+
+    @Override
+    public PrivateKey getPrivateKey() {
+        if (privateKey != null)
+            return privateKey;
+        privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
+        return privateKey;
+    }
+
+    @Override
+    public void setPrivateKey(PrivateKey privateKey) {
+        this.privateKey = privateKey;
+        String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
+        setPrivateKeyPem(privateKeyPem);
+    }
+
+    @Override
+    public String getCodeSecret() {
+        return updated != null ? updated.getCodeSecret() : cached.getCodeSecret();
+    }
+
+    @Override
+    public Key getCodeSecretKey() {
+        if (codeSecretKey == null) {
+            codeSecretKey = KeycloakModelUtils.getSecretKey(getCodeSecret());
+        }
+        return codeSecretKey;
+    }
+
+    @Override
+    public void setCodeSecret(String codeSecret) {
+        getDelegateForUpdate();
+        updated.setCodeSecret(codeSecret);
+    }
+
+    @Override
+    public List<RequiredCredentialModel> getRequiredCredentials() {
+
+        List<RequiredCredentialModel> copy = new LinkedList<RequiredCredentialModel>();
+        if (updated != null)
+            copy.addAll(updated.getRequiredCredentials());
+        else
+            copy.addAll(cached.getRequiredCredentials());
+        return copy;
+    }
+
+    @Override
+    public void addRequiredCredential(String cred) {
+        getDelegateForUpdate();
+        updated.addRequiredCredential(cred);
+    }
+
+    @Override
+    public PasswordPolicy getPasswordPolicy() {
+        if (updated != null)
+            return updated.getPasswordPolicy();
+        return cached.getPasswordPolicy();
+    }
+
+    @Override
+    public void setPasswordPolicy(PasswordPolicy policy) {
+        getDelegateForUpdate();
+        updated.setPasswordPolicy(policy);
+    }
+
+    @Override
+    public RoleModel getRoleById(String id) {
+        if (updated != null)
+            return updated.getRoleById(id);
+        return cacheSession.getRoleById(id, this);
+    }
+
+    @Override
+    public List<String> getDefaultRoles() {
+        if (updated != null)
+            return updated.getDefaultRoles();
+        return cached.getDefaultRoles();
+    }
+
+    @Override
+    public void addDefaultRole(String name) {
+        getDelegateForUpdate();
+        updated.addDefaultRole(name);
+    }
+
+    @Override
+    public void updateDefaultRoles(String[] defaultRoles) {
+        getDelegateForUpdate();
+        updated.updateDefaultRoles(defaultRoles);
+    }
+
+    @Override
+    public ClientModel findClient(String clientId) {
+        if (updated != null)
+            return updated.findClient(clientId);
+        String appId = cached.getApplications().get(clientId);
+        if (appId != null) {
+            return cacheSession.getApplicationById(appId, this);
+        }
+        String oauth = cached.getClients().get(clientId);
+        if (oauth != null) {
+            return cacheSession.getOAuthClientById(oauth, this);
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, ApplicationModel> getApplicationNameMap() {
+        if (updated != null)
+            return updated.getApplicationNameMap();
+        Map<String, ApplicationModel> map = new HashMap<String, ApplicationModel>();
+        for (String id : cached.getApplications().values()) {
+            ApplicationModel model = cacheSession.getApplicationById(id, this);
+            if (model == null) {
+                throw new IllegalStateException("Cached application not found: " + id);
+            }
+            map.put(model.getName(), model);
+        }
+        return map;
+    }
+
+    @Override
+    public List<ApplicationModel> getApplications() {
+        if (updated != null)
+            return updated.getApplications();
+        List<ApplicationModel> apps = new LinkedList<ApplicationModel>();
+        for (String id : cached.getApplications().values()) {
+            ApplicationModel model = cacheSession.getApplicationById(id, this);
+            if (model == null) {
+                throw new IllegalStateException("Cached application not found: " + id);
+            }
+            apps.add(model);
+        }
+        return apps;
+
+    }
+
+    @Override
+    public ApplicationModel addApplication(String name) {
+        getDelegateForUpdate();
+        ApplicationModel app = updated.addApplication(name);
+        cacheSession.registerApplicationInvalidation(app.getId());
+        return app;
+    }
+
+    @Override
+    public ApplicationModel addApplication(String id, String name) {
+        getDelegateForUpdate();
+        ApplicationModel app = updated.addApplication(id, name);
+        cacheSession.registerApplicationInvalidation(app.getId());
+        return app;
+    }
+
+    @Override
+    public boolean removeApplication(String id) {
+        cacheSession.registerApplicationInvalidation(id);
+        getDelegateForUpdate();
+        return updated.removeApplication(id);
+    }
+
+    @Override
+    public ApplicationModel getApplicationById(String id) {
+        if (updated != null)
+            return updated.getApplicationById(id);
+        return cacheSession.getApplicationById(id, this);
+    }
+
+    @Override
+    public ApplicationModel getApplicationByName(String name) {
+        if (updated != null)
+            return updated.getApplicationByName(name);
+        String id = cached.getApplications().get(name);
+        if (id == null)
+            return null;
+        return getApplicationById(id);
+    }
+
+    @Override
+    public void updateRequiredCredentials(Set<String> creds) {
+        getDelegateForUpdate();
+        updated.updateRequiredCredentials(creds);
+    }
+
+    @Override
+    public OAuthClientModel addOAuthClient(String name) {
+        getDelegateForUpdate();
+        OAuthClientModel client = updated.addOAuthClient(name);
+        cacheSession.registerOAuthClientInvalidation(client.getId());
+        return client;
+    }
+
+    @Override
+    public OAuthClientModel addOAuthClient(String id, String name) {
+        getDelegateForUpdate();
+        OAuthClientModel client = updated.addOAuthClient(id, name);
+        cacheSession.registerOAuthClientInvalidation(client.getId());
+        return client;
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClient(String name) {
+        if (updated != null)
+            return updated.getOAuthClient(name);
+        String id = cached.getClients().get(name);
+        if (id == null)
+            return null;
+        return getOAuthClientById(id);
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClientById(String id) {
+        if (updated != null)
+            return updated.getOAuthClientById(id);
+        return cacheSession.getOAuthClientById(id, this);
+    }
+
+    @Override
+    public boolean removeOAuthClient(String id) {
+        cacheSession.registerOAuthClientInvalidation(id);
+        getDelegateForUpdate();
+        return updated.removeOAuthClient(id);
+    }
+
+    @Override
+    public List<OAuthClientModel> getOAuthClients() {
+        if (updated != null)
+            return updated.getOAuthClients();
+        List<OAuthClientModel> clients = new LinkedList<OAuthClientModel>();
+        for (String id : cached.getClients().values()) {
+            OAuthClientModel model = cacheSession.getOAuthClientById(id, this);
+            if (model == null) {
+                throw new IllegalStateException("Cached oauth client not found: " + id);
+            }
+            clients.add(model);
+        }
+        return clients;
+    }
+
+    @Override
+    public Map<String, String> getBrowserSecurityHeaders() {
+        if (updated != null)
+            return updated.getBrowserSecurityHeaders();
+        return cached.getBrowserSecurityHeaders();
+    }
+
+    @Override
+    public void setBrowserSecurityHeaders(Map<String, String> headers) {
+        getDelegateForUpdate();
+        updated.setBrowserSecurityHeaders(headers);
+
+    }
+
+    @Override
+    public Map<String, String> getSmtpConfig() {
+        if (updated != null)
+            return updated.getSmtpConfig();
+        return cached.getSmtpConfig();
+    }
+
+    @Override
+    public void setSmtpConfig(Map<String, String> smtpConfig) {
+        getDelegateForUpdate();
+        updated.setSmtpConfig(smtpConfig);
+    }
+
+    @Override
+    public List<IdentityProviderModel> getIdentityProviders() {
+        if (updated != null)
+            return updated.getIdentityProviders();
+        return cached.getIdentityProviders();
+    }
+
+    @Override
+    public IdentityProviderModel getIdentityProviderById(String identityProviderId) {
+        for (IdentityProviderModel identityProviderModel : getIdentityProviders()) {
+            if (identityProviderModel.getId().equals(identityProviderId)) {
+                return identityProviderModel;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public void addIdentityProvider(IdentityProviderModel identityProvider) {
+        getDelegateForUpdate();
+        updated.addIdentityProvider(identityProvider);
+    }
+
+    @Override
+    public void updateIdentityProvider(IdentityProviderModel identityProvider) {
+        getDelegateForUpdate();
+        updated.updateIdentityProvider(identityProvider);
+    }
+
+    @Override
+    public void removeIdentityProviderById(String providerId) {
+        getDelegateForUpdate();
+        updated.removeIdentityProviderById(providerId);
+    }
+
+    @Override
+    public List<UserFederationProviderModel> getUserFederationProviders() {
+        if (updated != null)
+            return updated.getUserFederationProviders();
+        return cached.getUserFederationProviders();
+    }
+
+    @Override
+    public void setUserFederationProviders(List<UserFederationProviderModel> providers) {
+        getDelegateForUpdate();
+        updated.setUserFederationProviders(providers);
+    }
+
+    @Override
+    public UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config,
+            int priority, String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync) {
+        getDelegateForUpdate();
+        return updated.addUserFederationProvider(providerName, config, priority, displayName, fullSyncPeriod,
+                changedSyncPeriod, lastSync);
+    }
+
+    @Override
+    public void removeUserFederationProvider(UserFederationProviderModel provider) {
+        getDelegateForUpdate();
+        updated.removeUserFederationProvider(provider);
+
+    }
+
+    @Override
+    public void updateUserFederationProvider(UserFederationProviderModel provider) {
+        getDelegateForUpdate();
+        updated.updateUserFederationProvider(provider);
+
+    }
+
+    @Override
+    public String getLoginTheme() {
+        if (updated != null)
+            return updated.getLoginTheme();
+        return cached.getLoginTheme();
+    }
+
+    @Override
+    public void setLoginTheme(String name) {
+        getDelegateForUpdate();
+        updated.setLoginTheme(name);
+    }
+
+    @Override
+    public String getAccountTheme() {
+        if (updated != null)
+            return updated.getAccountTheme();
+        return cached.getAccountTheme();
+    }
+
+    @Override
+    public void setAccountTheme(String name) {
+        getDelegateForUpdate();
+        updated.setAccountTheme(name);
+    }
+
+    @Override
+    public String getAdminTheme() {
+        if (updated != null)
+            return updated.getAdminTheme();
+        return cached.getAdminTheme();
+    }
+
+    @Override
+    public void setAdminTheme(String name) {
+        getDelegateForUpdate();
+        updated.setAdminTheme(name);
+    }
+
+    @Override
+    public String getEmailTheme() {
+        if (updated != null)
+            return updated.getEmailTheme();
+        return cached.getEmailTheme();
+    }
+
+    @Override
+    public void setEmailTheme(String name) {
+        getDelegateForUpdate();
+        updated.setEmailTheme(name);
+    }
+
+    @Override
+    public int getNotBefore() {
+        if (updated != null)
+            return updated.getNotBefore();
+        return cached.getNotBefore();
+    }
+
+    @Override
+    public void setNotBefore(int notBefore) {
+        getDelegateForUpdate();
+        updated.setNotBefore(notBefore);
+    }
+
+    @Override
+    public boolean removeRoleById(String id) {
+        cacheSession.registerRoleInvalidation(id);
+        getDelegateForUpdate();
+        return updated.removeRoleById(id);
+    }
+
+    @Override
+    public boolean isEventsEnabled() {
+        if (updated != null)
+            return updated.isEventsEnabled();
+        return cached.isEventsEnabled();
+    }
+
+    @Override
+    public void setEventsEnabled(boolean enabled) {
+        getDelegateForUpdate();
+        updated.setEventsEnabled(enabled);
+    }
+
+    @Override
+    public long getEventsExpiration() {
+        if (updated != null)
+            return updated.getEventsExpiration();
+        return cached.getEventsExpiration();
+    }
+
+    @Override
+    public void setEventsExpiration(long expiration) {
+        getDelegateForUpdate();
+        updated.setEventsExpiration(expiration);
+    }
+
+    @Override
+    public Set<String> getEventsListeners() {
+        if (updated != null)
+            return updated.getEventsListeners();
+        return cached.getEventsListeners();
+    }
+
+    @Override
+    public void setEventsListeners(Set<String> listeners) {
+        getDelegateForUpdate();
+        updated.setEventsListeners(listeners);
+    }
+
+    @Override
+    public ApplicationModel getMasterAdminApp() {
+        return cacheSession.getRealm(Config.getAdminRealm()).getApplicationById(cached.getMasterAdminApp());
+    }
+
+    @Override
+    public void setMasterAdminApp(ApplicationModel app) {
+        getDelegateForUpdate();
+        updated.setMasterAdminApp(app);
+    }
+
+    @Override
+    public RoleModel getRole(String name) {
+        if (updated != null)
+            return updated.getRole(name);
+        String id = cached.getRealmRoles().get(name);
+        if (id == null)
+            return null;
+        return cacheSession.getRoleById(id, this);
+    }
+
+    @Override
+    public RoleModel addRole(String name) {
+        getDelegateForUpdate();
+        RoleModel role = updated.addRole(name);
+        cacheSession.registerRoleInvalidation(role.getId());
+        return role;
+    }
+
+    @Override
+    public RoleModel addRole(String id, String name) {
+        getDelegateForUpdate();
+        RoleModel role = updated.addRole(id, name);
+        cacheSession.registerRoleInvalidation(role.getId());
+        return role;
+    }
+
+    @Override
+    public boolean removeRole(RoleModel role) {
+        cacheSession.registerRoleInvalidation(role.getId());
+        getDelegateForUpdate();
+        return updated.removeRole(role);
+    }
+
+    @Override
+    public Set<RoleModel> getRoles() {
+        if (updated != null)
+            return updated.getRoles();
+
+        Set<RoleModel> roles = new HashSet<RoleModel>();
+        for (String id : cached.getRealmRoles().values()) {
+            RoleModel roleById = cacheSession.getRoleById(id, this);
+            if (roleById == null)
+                continue;
+            roles.add(roleById);
+        }
+        return roles;
+    }
+
+    @Override
+    public ClientModel findClientById(String id) {
+        ClientModel model = getApplicationById(id);
+        if (model != null)
+            return model;
+        return getOAuthClientById(id);
+    }
+
+    @Override
+    public boolean isIdentityFederationEnabled() {
+        if (updated != null)
+            return updated.isIdentityFederationEnabled();
+        return cached.isIdentityFederationEnabled();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || !(o instanceof RealmModel))
+            return false;
+
+        RealmModel that = (RealmModel) o;
+        return that.getId().equals(getId());
+    }
+
+    @Override
+    public int hashCode() {
+        return getId().hashCode();
+    }
 }
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
index 702f8cd..25fcc06 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
@@ -31,425 +31,425 @@ import javax.persistence.Table;
 @Table(name = "REALM")
 @Entity
 @NamedQueries({ @NamedQuery(name = "getAllRealms", query = "select realm from RealmEntity realm"),
-		@NamedQuery(name = "getRealmByName", query = "select realm from RealmEntity realm where realm.name = :name"), })
+        @NamedQuery(name = "getRealmByName", query = "select realm from RealmEntity realm where realm.name = :name"), })
 public class RealmEntity {
-	@Id
-	@Column(name = "ID", length = 36)
-	protected String id;
-
-	@Column(name = "NAME", unique = true)
-	protected String name;
-
-	@Column(name = "ENABLED")
-	protected boolean enabled;
-	@Column(name = "SSL_REQUIRED")
-	protected String sslRequired;
-	@Column(name = "REGISTRATION_ALLOWED")
-	protected boolean registrationAllowed;
-	@Column(name = "REGISTRATION_EMAIL_AS_USERNAME")
-	protected boolean registrationEmailAsUsername;
-	@Column(name = "PASSWORD_CRED_GRANT_ALLOWED")
-	protected boolean passwordCredentialGrantAllowed;
-	@Column(name = "VERIFY_EMAIL")
-	protected boolean verifyEmail;
-	@Column(name = "RESET_PASSWORD_ALLOWED")
-	protected boolean resetPasswordAllowed;
-	@Column(name = "REMEMBER_ME")
-	protected boolean rememberMe;
-	@Column(name = "PASSWORD_POLICY")
-	protected String passwordPolicy;
-
-	@Column(name = "SSO_IDLE_TIMEOUT")
-	private int ssoSessionIdleTimeout;
-	@Column(name = "SSO_MAX_LIFESPAN")
-	private int ssoSessionMaxLifespan;
-	@Column(name = "ACCESS_TOKEN_LIFESPAN")
-	protected int accessTokenLifespan;
-	@Column(name = "ACCESS_CODE_LIFESPAN")
-	protected int accessCodeLifespan;
-	@Column(name = "USER_ACTION_LIFESPAN")
-	protected int accessCodeLifespanUserAction;
-	@Column(name = "LOGIN_LIFESPAN")
-	protected int accessCodeLifespanLogin;
-	@Column(name = "NOT_BEFORE")
-	protected int notBefore;
-
-	@Column(name = "PUBLIC_KEY", length = 2048)
-	protected String publicKeyPem;
-	@Column(name = "PRIVATE_KEY", length = 2048)
-	protected String privateKeyPem;
-	@Column(name = "CERTIFICATE", length = 2048)
-	protected String certificatePem;
-	@Column(name = "CODE_SECRET", length = 255)
-	protected String codeSecret;
-
-	@Column(name = "LOGIN_THEME")
-	protected String loginTheme;
-	@Column(name = "ACCOUNT_THEME")
-	protected String accountTheme;
-	@Column(name = "ADMIN_THEME")
-	protected String adminTheme;
-	@Column(name = "EMAIL_THEME")
-	protected String emailTheme;
-
-	@OneToMany(cascade = { CascadeType.REMOVE }, orphanRemoval = true, mappedBy = "realm")
-	Collection<RealmAttributeEntity> attributes = new ArrayList<RealmAttributeEntity>();
-
-	@OneToMany(cascade = { CascadeType.REMOVE }, orphanRemoval = true, mappedBy = "realm")
-	Collection<RequiredCredentialEntity> requiredCredentials = new ArrayList<RequiredCredentialEntity>();
-
-	@OneToMany(cascade = { CascadeType.REMOVE }, orphanRemoval = true)
-	@JoinTable(name = "FED_PROVIDERS")
-	List<UserFederationProviderEntity> userFederationProviders = new ArrayList<UserFederationProviderEntity>();
-
-	@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, orphanRemoval = true)
-	@JoinTable(name = "REALM_APPLICATION", joinColumns = { @JoinColumn(name = "APPLICATION_ID") }, inverseJoinColumns = { @JoinColumn(name = "REALM_ID") })
-	Collection<ApplicationEntity> applications = new ArrayList<ApplicationEntity>();
-
-	@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, orphanRemoval = true, mappedBy = "realm")
-	Collection<RoleEntity> roles = new ArrayList<RoleEntity>();
-
-	@ElementCollection
-	@MapKeyColumn(name = "NAME")
-	@Column(name = "VALUE")
-	@CollectionTable(name = "REALM_SMTP_CONFIG", joinColumns = { @JoinColumn(name = "REALM_ID") })
-	protected Map<String, String> smtpConfig = new HashMap<String, String>();
-
-	@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, orphanRemoval = true)
-	@JoinTable(name = "REALM_DEFAULT_ROLES", joinColumns = { @JoinColumn(name = "REALM_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
-	protected Collection<RoleEntity> defaultRoles = new ArrayList<RoleEntity>();
-
-	@Column(name = "EVENTS_ENABLED")
-	protected boolean eventsEnabled;
-	@Column(name = "EVENTS_EXPIRATION")
-	protected long eventsExpiration;
-
-	@ElementCollection
-	@Column(name = "VALUE")
-	@CollectionTable(name = "REALM_EVENTS_LISTENERS", joinColumns = { @JoinColumn(name = "REALM_ID") })
-	protected Set<String> eventsListeners = new HashSet<String>();
-
-	@OneToOne
-	@JoinColumn(name = "MASTER_ADMIN_APP")
-	protected ApplicationEntity masterAdminApp;
-
-	@OneToMany(cascade = { CascadeType.REMOVE }, orphanRemoval = true, mappedBy = "realm")
-	protected List<IdentityProviderEntity> identityProviders = new ArrayList<IdentityProviderEntity>();
-
-	public String getId() {
-		return id;
-	}
-
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-
-	public String getSslRequired() {
-		return sslRequired;
-	}
-
-	public void setSslRequired(String sslRequired) {
-		this.sslRequired = sslRequired;
-	}
-
-	public boolean isPasswordCredentialGrantAllowed() {
-		return passwordCredentialGrantAllowed;
-	}
-
-	public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
-		this.passwordCredentialGrantAllowed = passwordCredentialGrantAllowed;
-	}
-
-	public boolean isRegistrationAllowed() {
-		return registrationAllowed;
-	}
-
-	public void setRegistrationAllowed(boolean registrationAllowed) {
-		this.registrationAllowed = registrationAllowed;
-	}
-
-	public boolean isRegistrationEmailAsUsername() {
-		return registrationEmailAsUsername;
-	}
+    @Id
+    @Column(name = "ID", length = 36)
+    protected String id;
+
+    @Column(name = "NAME", unique = true)
+    protected String name;
+
+    @Column(name = "ENABLED")
+    protected boolean enabled;
+    @Column(name = "SSL_REQUIRED")
+    protected String sslRequired;
+    @Column(name = "REGISTRATION_ALLOWED")
+    protected boolean registrationAllowed;
+    @Column(name = "REGISTRATION_EMAIL_AS_USERNAME")
+    protected boolean registrationEmailAsUsername;
+    @Column(name = "PASSWORD_CRED_GRANT_ALLOWED")
+    protected boolean passwordCredentialGrantAllowed;
+    @Column(name = "VERIFY_EMAIL")
+    protected boolean verifyEmail;
+    @Column(name = "RESET_PASSWORD_ALLOWED")
+    protected boolean resetPasswordAllowed;
+    @Column(name = "REMEMBER_ME")
+    protected boolean rememberMe;
+    @Column(name = "PASSWORD_POLICY")
+    protected String passwordPolicy;
+
+    @Column(name = "SSO_IDLE_TIMEOUT")
+    private int ssoSessionIdleTimeout;
+    @Column(name = "SSO_MAX_LIFESPAN")
+    private int ssoSessionMaxLifespan;
+    @Column(name = "ACCESS_TOKEN_LIFESPAN")
+    protected int accessTokenLifespan;
+    @Column(name = "ACCESS_CODE_LIFESPAN")
+    protected int accessCodeLifespan;
+    @Column(name = "USER_ACTION_LIFESPAN")
+    protected int accessCodeLifespanUserAction;
+    @Column(name = "LOGIN_LIFESPAN")
+    protected int accessCodeLifespanLogin;
+    @Column(name = "NOT_BEFORE")
+    protected int notBefore;
+
+    @Column(name = "PUBLIC_KEY", length = 2048)
+    protected String publicKeyPem;
+    @Column(name = "PRIVATE_KEY", length = 2048)
+    protected String privateKeyPem;
+    @Column(name = "CERTIFICATE", length = 2048)
+    protected String certificatePem;
+    @Column(name = "CODE_SECRET", length = 255)
+    protected String codeSecret;
+
+    @Column(name = "LOGIN_THEME")
+    protected String loginTheme;
+    @Column(name = "ACCOUNT_THEME")
+    protected String accountTheme;
+    @Column(name = "ADMIN_THEME")
+    protected String adminTheme;
+    @Column(name = "EMAIL_THEME")
+    protected String emailTheme;
+
+    @OneToMany(cascade = { CascadeType.REMOVE }, orphanRemoval = true, mappedBy = "realm")
+    Collection<RealmAttributeEntity> attributes = new ArrayList<RealmAttributeEntity>();
+
+    @OneToMany(cascade = { CascadeType.REMOVE }, orphanRemoval = true, mappedBy = "realm")
+    Collection<RequiredCredentialEntity> requiredCredentials = new ArrayList<RequiredCredentialEntity>();
+
+    @OneToMany(cascade = { CascadeType.REMOVE }, orphanRemoval = true)
+    @JoinTable(name = "FED_PROVIDERS")
+    List<UserFederationProviderEntity> userFederationProviders = new ArrayList<UserFederationProviderEntity>();
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, orphanRemoval = true)
+    @JoinTable(name = "REALM_APPLICATION", joinColumns = { @JoinColumn(name = "APPLICATION_ID") }, inverseJoinColumns = { @JoinColumn(name = "REALM_ID") })
+    Collection<ApplicationEntity> applications = new ArrayList<ApplicationEntity>();
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, orphanRemoval = true, mappedBy = "realm")
+    Collection<RoleEntity> roles = new ArrayList<RoleEntity>();
+
+    @ElementCollection
+    @MapKeyColumn(name = "NAME")
+    @Column(name = "VALUE")
+    @CollectionTable(name = "REALM_SMTP_CONFIG", joinColumns = { @JoinColumn(name = "REALM_ID") })
+    protected Map<String, String> smtpConfig = new HashMap<String, String>();
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, orphanRemoval = true)
+    @JoinTable(name = "REALM_DEFAULT_ROLES", joinColumns = { @JoinColumn(name = "REALM_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
+    protected Collection<RoleEntity> defaultRoles = new ArrayList<RoleEntity>();
+
+    @Column(name = "EVENTS_ENABLED")
+    protected boolean eventsEnabled;
+    @Column(name = "EVENTS_EXPIRATION")
+    protected long eventsExpiration;
+
+    @ElementCollection
+    @Column(name = "VALUE")
+    @CollectionTable(name = "REALM_EVENTS_LISTENERS", joinColumns = { @JoinColumn(name = "REALM_ID") })
+    protected Set<String> eventsListeners = new HashSet<String>();
+
+    @OneToOne
+    @JoinColumn(name = "MASTER_ADMIN_APP")
+    protected ApplicationEntity masterAdminApp;
+
+    @OneToMany(cascade = { CascadeType.REMOVE }, orphanRemoval = true, mappedBy = "realm")
+    protected List<IdentityProviderEntity> identityProviders = new ArrayList<IdentityProviderEntity>();
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public String getSslRequired() {
+        return sslRequired;
+    }
+
+    public void setSslRequired(String sslRequired) {
+        this.sslRequired = sslRequired;
+    }
+
+    public boolean isPasswordCredentialGrantAllowed() {
+        return passwordCredentialGrantAllowed;
+    }
+
+    public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
+        this.passwordCredentialGrantAllowed = passwordCredentialGrantAllowed;
+    }
+
+    public boolean isRegistrationAllowed() {
+        return registrationAllowed;
+    }
+
+    public void setRegistrationAllowed(boolean registrationAllowed) {
+        this.registrationAllowed = registrationAllowed;
+    }
+
+    public boolean isRegistrationEmailAsUsername() {
+        return registrationEmailAsUsername;
+    }
 
-	public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
-		this.registrationEmailAsUsername = registrationEmailAsUsername;
-	}
+    public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
+        this.registrationEmailAsUsername = registrationEmailAsUsername;
+    }
 
-	public boolean isRememberMe() {
-		return rememberMe;
-	}
+    public boolean isRememberMe() {
+        return rememberMe;
+    }
 
-	public void setRememberMe(boolean rememberMe) {
-		this.rememberMe = rememberMe;
-	}
+    public void setRememberMe(boolean rememberMe) {
+        this.rememberMe = rememberMe;
+    }
 
-	public boolean isVerifyEmail() {
-		return verifyEmail;
-	}
+    public boolean isVerifyEmail() {
+        return verifyEmail;
+    }
 
-	public void setVerifyEmail(boolean verifyEmail) {
-		this.verifyEmail = verifyEmail;
-	}
+    public void setVerifyEmail(boolean verifyEmail) {
+        this.verifyEmail = verifyEmail;
+    }
 
-	public boolean isResetPasswordAllowed() {
-		return resetPasswordAllowed;
-	}
+    public boolean isResetPasswordAllowed() {
+        return resetPasswordAllowed;
+    }
 
-	public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
-		this.resetPasswordAllowed = resetPasswordAllowed;
-	}
-
-	public int getSsoSessionIdleTimeout() {
-		return ssoSessionIdleTimeout;
-	}
-
-	public void setSsoSessionIdleTimeout(int ssoSessionIdleTimeout) {
-		this.ssoSessionIdleTimeout = ssoSessionIdleTimeout;
-	}
+    public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
+        this.resetPasswordAllowed = resetPasswordAllowed;
+    }
+
+    public int getSsoSessionIdleTimeout() {
+        return ssoSessionIdleTimeout;
+    }
+
+    public void setSsoSessionIdleTimeout(int ssoSessionIdleTimeout) {
+        this.ssoSessionIdleTimeout = ssoSessionIdleTimeout;
+    }
 
-	public int getSsoSessionMaxLifespan() {
-		return ssoSessionMaxLifespan;
-	}
+    public int getSsoSessionMaxLifespan() {
+        return ssoSessionMaxLifespan;
+    }
 
-	public void setSsoSessionMaxLifespan(int ssoSessionMaxLifespan) {
-		this.ssoSessionMaxLifespan = ssoSessionMaxLifespan;
-	}
+    public void setSsoSessionMaxLifespan(int ssoSessionMaxLifespan) {
+        this.ssoSessionMaxLifespan = ssoSessionMaxLifespan;
+    }
 
-	public int getAccessTokenLifespan() {
-		return accessTokenLifespan;
-	}
+    public int getAccessTokenLifespan() {
+        return accessTokenLifespan;
+    }
 
-	public void setAccessTokenLifespan(int accessTokenLifespan) {
-		this.accessTokenLifespan = accessTokenLifespan;
-	}
+    public void setAccessTokenLifespan(int accessTokenLifespan) {
+        this.accessTokenLifespan = accessTokenLifespan;
+    }
 
-	public int getAccessCodeLifespan() {
-		return accessCodeLifespan;
-	}
+    public int getAccessCodeLifespan() {
+        return accessCodeLifespan;
+    }
 
-	public void setAccessCodeLifespan(int accessCodeLifespan) {
-		this.accessCodeLifespan = accessCodeLifespan;
-	}
+    public void setAccessCodeLifespan(int accessCodeLifespan) {
+        this.accessCodeLifespan = accessCodeLifespan;
+    }
 
-	public int getAccessCodeLifespanUserAction() {
-		return accessCodeLifespanUserAction;
-	}
+    public int getAccessCodeLifespanUserAction() {
+        return accessCodeLifespanUserAction;
+    }
 
-	public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
-		this.accessCodeLifespanUserAction = accessCodeLifespanUserAction;
-	}
+    public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
+        this.accessCodeLifespanUserAction = accessCodeLifespanUserAction;
+    }
 
-	public int getAccessCodeLifespanLogin() {
-		return accessCodeLifespanLogin;
-	}
+    public int getAccessCodeLifespanLogin() {
+        return accessCodeLifespanLogin;
+    }
 
-	public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
-		this.accessCodeLifespanLogin = accessCodeLifespanLogin;
-	}
+    public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
+        this.accessCodeLifespanLogin = accessCodeLifespanLogin;
+    }
 
-	public String getPublicKeyPem() {
-		return publicKeyPem;
-	}
+    public String getPublicKeyPem() {
+        return publicKeyPem;
+    }
 
-	public void setPublicKeyPem(String publicKeyPem) {
-		this.publicKeyPem = publicKeyPem;
-	}
+    public void setPublicKeyPem(String publicKeyPem) {
+        this.publicKeyPem = publicKeyPem;
+    }
 
-	public String getPrivateKeyPem() {
-		return privateKeyPem;
-	}
+    public String getPrivateKeyPem() {
+        return privateKeyPem;
+    }
 
-	public void setPrivateKeyPem(String privateKeyPem) {
-		this.privateKeyPem = privateKeyPem;
-	}
+    public void setPrivateKeyPem(String privateKeyPem) {
+        this.privateKeyPem = privateKeyPem;
+    }
 
-	public String getCodeSecret() {
-		return codeSecret;
-	}
+    public String getCodeSecret() {
+        return codeSecret;
+    }
 
-	public void setCodeSecret(String codeSecret) {
-		this.codeSecret = codeSecret;
-	}
+    public void setCodeSecret(String codeSecret) {
+        this.codeSecret = codeSecret;
+    }
 
-	public Collection<RequiredCredentialEntity> getRequiredCredentials() {
-		return requiredCredentials;
-	}
+    public Collection<RequiredCredentialEntity> getRequiredCredentials() {
+        return requiredCredentials;
+    }
 
-	public void setRequiredCredentials(Collection<RequiredCredentialEntity> requiredCredentials) {
-		this.requiredCredentials = requiredCredentials;
-	}
+    public void setRequiredCredentials(Collection<RequiredCredentialEntity> requiredCredentials) {
+        this.requiredCredentials = requiredCredentials;
+    }
 
-	public Collection<ApplicationEntity> getApplications() {
-		return applications;
-	}
+    public Collection<ApplicationEntity> getApplications() {
+        return applications;
+    }
 
-	public void setApplications(Collection<ApplicationEntity> applications) {
-		this.applications = applications;
-	}
+    public void setApplications(Collection<ApplicationEntity> applications) {
+        this.applications = applications;
+    }
 
-	public Collection<RoleEntity> getRoles() {
-		return roles;
-	}
+    public Collection<RoleEntity> getRoles() {
+        return roles;
+    }
 
-	public void setRoles(Collection<RoleEntity> roles) {
-		this.roles = roles;
-	}
+    public void setRoles(Collection<RoleEntity> roles) {
+        this.roles = roles;
+    }
 
-	public void addRole(RoleEntity role) {
-		if (roles == null) {
-			roles = new ArrayList<RoleEntity>();
-		}
-		roles.add(role);
-	}
+    public void addRole(RoleEntity role) {
+        if (roles == null) {
+            roles = new ArrayList<RoleEntity>();
+        }
+        roles.add(role);
+    }
 
-	public Map<String, String> getSmtpConfig() {
-		return smtpConfig;
-	}
+    public Map<String, String> getSmtpConfig() {
+        return smtpConfig;
+    }
 
-	public void setSmtpConfig(Map<String, String> smtpConfig) {
-		this.smtpConfig = smtpConfig;
-	}
+    public void setSmtpConfig(Map<String, String> smtpConfig) {
+        this.smtpConfig = smtpConfig;
+    }
 
-	public Collection<RoleEntity> getDefaultRoles() {
-		return defaultRoles;
-	}
+    public Collection<RoleEntity> getDefaultRoles() {
+        return defaultRoles;
+    }
 
-	public void setDefaultRoles(Collection<RoleEntity> defaultRoles) {
-		this.defaultRoles = defaultRoles;
-	}
+    public void setDefaultRoles(Collection<RoleEntity> defaultRoles) {
+        this.defaultRoles = defaultRoles;
+    }
 
-	public String getPasswordPolicy() {
-		return passwordPolicy;
-	}
+    public String getPasswordPolicy() {
+        return passwordPolicy;
+    }
 
-	public void setPasswordPolicy(String passwordPolicy) {
-		this.passwordPolicy = passwordPolicy;
-	}
+    public void setPasswordPolicy(String passwordPolicy) {
+        this.passwordPolicy = passwordPolicy;
+    }
 
-	public String getLoginTheme() {
-		return loginTheme;
-	}
+    public String getLoginTheme() {
+        return loginTheme;
+    }
 
-	public void setLoginTheme(String theme) {
-		this.loginTheme = theme;
-	}
-
-	public String getAccountTheme() {
-		return accountTheme;
-	}
-
-	public void setAccountTheme(String theme) {
-		this.accountTheme = theme;
-	}
-
-	public String getAdminTheme() {
-		return adminTheme;
-	}
-
-	public void setAdminTheme(String adminTheme) {
-		this.adminTheme = adminTheme;
-	}
-
-	public String getEmailTheme() {
-		return emailTheme;
-	}
-
-	public void setEmailTheme(String emailTheme) {
-		this.emailTheme = emailTheme;
-	}
-
-	public int getNotBefore() {
-		return notBefore;
-	}
-
-	public void setNotBefore(int notBefore) {
-		this.notBefore = notBefore;
-	}
-
-	public boolean isEventsEnabled() {
-		return eventsEnabled;
-	}
-
-	public void setEventsEnabled(boolean eventsEnabled) {
-		this.eventsEnabled = eventsEnabled;
-	}
-
-	public long getEventsExpiration() {
-		return eventsExpiration;
-	}
-
-	public void setEventsExpiration(long eventsExpiration) {
-		this.eventsExpiration = eventsExpiration;
-	}
-
-	public Set<String> getEventsListeners() {
-		return eventsListeners;
-	}
-
-	public void setEventsListeners(Set<String> eventsListeners) {
-		this.eventsListeners = eventsListeners;
-	}
-
-	public ApplicationEntity getMasterAdminApp() {
-		return masterAdminApp;
-	}
-
-	public void setMasterAdminApp(ApplicationEntity masterAdminApp) {
-		this.masterAdminApp = masterAdminApp;
-	}
-
-	public List<UserFederationProviderEntity> getUserFederationProviders() {
-		return userFederationProviders;
-	}
+    public void setLoginTheme(String theme) {
+        this.loginTheme = theme;
+    }
+
+    public String getAccountTheme() {
+        return accountTheme;
+    }
+
+    public void setAccountTheme(String theme) {
+        this.accountTheme = theme;
+    }
+
+    public String getAdminTheme() {
+        return adminTheme;
+    }
+
+    public void setAdminTheme(String adminTheme) {
+        this.adminTheme = adminTheme;
+    }
+
+    public String getEmailTheme() {
+        return emailTheme;
+    }
+
+    public void setEmailTheme(String emailTheme) {
+        this.emailTheme = emailTheme;
+    }
+
+    public int getNotBefore() {
+        return notBefore;
+    }
+
+    public void setNotBefore(int notBefore) {
+        this.notBefore = notBefore;
+    }
+
+    public boolean isEventsEnabled() {
+        return eventsEnabled;
+    }
+
+    public void setEventsEnabled(boolean eventsEnabled) {
+        this.eventsEnabled = eventsEnabled;
+    }
+
+    public long getEventsExpiration() {
+        return eventsExpiration;
+    }
+
+    public void setEventsExpiration(long eventsExpiration) {
+        this.eventsExpiration = eventsExpiration;
+    }
+
+    public Set<String> getEventsListeners() {
+        return eventsListeners;
+    }
+
+    public void setEventsListeners(Set<String> eventsListeners) {
+        this.eventsListeners = eventsListeners;
+    }
+
+    public ApplicationEntity getMasterAdminApp() {
+        return masterAdminApp;
+    }
+
+    public void setMasterAdminApp(ApplicationEntity masterAdminApp) {
+        this.masterAdminApp = masterAdminApp;
+    }
+
+    public List<UserFederationProviderEntity> getUserFederationProviders() {
+        return userFederationProviders;
+    }
 
-	public void setUserFederationProviders(List<UserFederationProviderEntity> userFederationProviders) {
-		this.userFederationProviders = userFederationProviders;
-	}
+    public void setUserFederationProviders(List<UserFederationProviderEntity> userFederationProviders) {
+        this.userFederationProviders = userFederationProviders;
+    }
 
-	public Collection<RealmAttributeEntity> getAttributes() {
-		return attributes;
-	}
+    public Collection<RealmAttributeEntity> getAttributes() {
+        return attributes;
+    }
 
-	public void setAttributes(Collection<RealmAttributeEntity> attributes) {
-		this.attributes = attributes;
-	}
+    public void setAttributes(Collection<RealmAttributeEntity> attributes) {
+        this.attributes = attributes;
+    }
 
-	public String getCertificatePem() {
-		return certificatePem;
-	}
+    public String getCertificatePem() {
+        return certificatePem;
+    }
 
-	public void setCertificatePem(String certificatePem) {
-		this.certificatePem = certificatePem;
-	}
+    public void setCertificatePem(String certificatePem) {
+        this.certificatePem = certificatePem;
+    }
 
-	public List<IdentityProviderEntity> getIdentityProviders() {
-		return this.identityProviders;
-	}
+    public List<IdentityProviderEntity> getIdentityProviders() {
+        return this.identityProviders;
+    }
 
-	public void setIdentityProviders(List<IdentityProviderEntity> identityProviders) {
-		this.identityProviders = identityProviders;
-	}
+    public void setIdentityProviders(List<IdentityProviderEntity> identityProviders) {
+        this.identityProviders = identityProviders;
+    }
 
-	public void addIdentityProvider(IdentityProviderEntity entity) {
-		entity.setRealm(this);
-		getIdentityProviders().add(entity);
-	}
+    public void addIdentityProvider(IdentityProviderEntity entity) {
+        entity.setRealm(this);
+        getIdentityProviders().add(entity);
+    }
 
 }
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
index 086256a..20ea624 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
@@ -45,1228 +45,1228 @@ import org.keycloak.models.utils.KeycloakModelUtils;
  * @version $Revision: 1 $
  */
 public class RealmAdapter implements RealmModel {
-	protected RealmEntity realm;
-	protected EntityManager em;
-	protected volatile transient PublicKey publicKey;
-	protected volatile transient PrivateKey privateKey;
-	protected volatile transient X509Certificate certificate;
-	protected volatile transient Key codeSecretKey;
-	protected KeycloakSession session;
-	private PasswordPolicy passwordPolicy;
-
-	public RealmAdapter(KeycloakSession session, EntityManager em, RealmEntity realm) {
-		this.session = session;
-		this.em = em;
-		this.realm = realm;
-	}
-
-	public RealmEntity getEntity() {
-		return realm;
-	}
-
-	@Override
-	public String getId() {
-		return realm.getId();
-	}
-
-	@Override
-	public String getName() {
-		return realm.getName();
-	}
-
-	@Override
-	public void setName(String name) {
-		realm.setName(name);
-		em.flush();
-	}
-
-	@Override
-	public boolean isEnabled() {
-		return realm.isEnabled();
-	}
-
-	@Override
-	public void setEnabled(boolean enabled) {
-		realm.setEnabled(enabled);
-		em.flush();
-	}
-
-	@Override
-	public SslRequired getSslRequired() {
-		return realm.getSslRequired() != null ? SslRequired.valueOf(realm.getSslRequired()) : null;
-	}
-
-	@Override
-	public void setSslRequired(SslRequired sslRequired) {
-		realm.setSslRequired(sslRequired.name());
-		em.flush();
-	}
-
-	@Override
-	public boolean isPasswordCredentialGrantAllowed() {
-		return realm.isPasswordCredentialGrantAllowed();
-	}
-
-	@Override
-	public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
-		realm.setPasswordCredentialGrantAllowed(passwordCredentialGrantAllowed);
-		em.flush();
-	}
-
-	@Override
-	public boolean isRegistrationAllowed() {
-		return realm.isRegistrationAllowed();
-	}
-
-	@Override
-	public void setRegistrationAllowed(boolean registrationAllowed) {
-		realm.setRegistrationAllowed(registrationAllowed);
-		em.flush();
-	}
-
-	@Override
-	public boolean isRegistrationEmailAsUsername() {
-		return realm.isRegistrationEmailAsUsername();
-	}
-
-	@Override
-	public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
-		realm.setRegistrationEmailAsUsername(registrationEmailAsUsername);
-		em.flush();
-	}
-
-	@Override
-	public boolean isRememberMe() {
-		return realm.isRememberMe();
-	}
-
-	@Override
-	public void setRememberMe(boolean rememberMe) {
-		realm.setRememberMe(rememberMe);
-		em.flush();
-	}
-
-	public void setAttribute(String name, String value) {
-		for (RealmAttributeEntity attr : realm.getAttributes()) {
-			if (attr.getName().equals(name)) {
-				attr.setValue(value);
-				return;
-			}
-		}
-		RealmAttributeEntity attr = new RealmAttributeEntity();
-		attr.setName(name);
-		attr.setValue(value);
-		attr.setRealm(realm);
-		em.persist(attr);
-		realm.getAttributes().add(attr);
-	}
-
-	public void setAttribute(String name, Boolean value) {
-		setAttribute(name, value.toString());
-	}
-
-	public void setAttribute(String name, Integer value) {
-		setAttribute(name, value.toString());
-	}
-
-	public void setAttribute(String name, Long value) {
-		setAttribute(name, value.toString());
-	}
-
-	public void removeAttribute(String name) {
-		Iterator<RealmAttributeEntity> it = realm.getAttributes().iterator();
-		while (it.hasNext()) {
-			RealmAttributeEntity attr = it.next();
-			if (attr.getName().equals(name)) {
-				it.remove();
-				em.remove(attr);
-			}
-		}
-	}
-
-	public String getAttribute(String name) {
-		for (RealmAttributeEntity attr : realm.getAttributes()) {
-			if (attr.getName().equals(name)) {
-				return attr.getValue();
-			}
-		}
-		return null;
-	}
-
-	public Integer getAttribute(String name, Integer defaultValue) {
-		String v = getAttribute(name);
-		return v != null ? Integer.parseInt(v) : defaultValue;
-
-	}
-
-	public Long getAttribute(String name, Long defaultValue) {
-		String v = getAttribute(name);
-		return v != null ? Long.parseLong(v) : defaultValue;
-
-	}
-
-	public Boolean getAttribute(String name, Boolean defaultValue) {
-		String v = getAttribute(name);
-		return v != null ? Boolean.parseBoolean(v) : defaultValue;
-
-	}
-
-	public Map<String, String> getAttributes() {
-		// should always return a copy
-		Map<String, String> result = new HashMap<String, String>();
-		for (RealmAttributeEntity attr : realm.getAttributes()) {
-			result.put(attr.getName(), attr.getValue());
-		}
-		return result;
-	}
-
-	@Override
-	public boolean isBruteForceProtected() {
-		return getAttribute("bruteForceProtected", false);
-	}
-
-	@Override
-	public void setBruteForceProtected(boolean value) {
-		setAttribute("bruteForceProtected", value);
-	}
-
-	@Override
-	public int getMaxFailureWaitSeconds() {
-		return getAttribute("maxFailureWaitSeconds", 0);
-	}
-
-	@Override
-	public void setMaxFailureWaitSeconds(int val) {
-		setAttribute("maxFailureWaitSeconds", val);
-	}
-
-	@Override
-	public int getWaitIncrementSeconds() {
-		return getAttribute("waitIncrementSeconds", 0);
-	}
-
-	@Override
-	public void setWaitIncrementSeconds(int val) {
-		setAttribute("waitIncrementSeconds", val);
-	}
-
-	@Override
-	public long getQuickLoginCheckMilliSeconds() {
-		return getAttribute("quickLoginCheckMilliSeconds", 0l);
-	}
-
-	@Override
-	public void setQuickLoginCheckMilliSeconds(long val) {
-		setAttribute("quickLoginCheckMilliSeconds", val);
-	}
-
-	@Override
-	public int getMinimumQuickLoginWaitSeconds() {
-		return getAttribute("minimumQuickLoginWaitSeconds", 0);
-	}
-
-	@Override
-	public void setMinimumQuickLoginWaitSeconds(int val) {
-		setAttribute("minimumQuickLoginWaitSeconds", val);
-	}
-
-	@Override
-	public int getMaxDeltaTimeSeconds() {
-		return getAttribute("maxDeltaTimeSeconds", 0);
-	}
-
-	@Override
-	public void setMaxDeltaTimeSeconds(int val) {
-		setAttribute("maxDeltaTimeSeconds", val);
-	}
-
-	@Override
-	public int getFailureFactor() {
-		return getAttribute("failureFactor", 0);
-	}
-
-	@Override
-	public void setFailureFactor(int failureFactor) {
-		setAttribute("failureFactor", failureFactor);
-	}
-
-	@Override
-	public boolean isVerifyEmail() {
-		return realm.isVerifyEmail();
-	}
-
-	@Override
-	public void setVerifyEmail(boolean verifyEmail) {
-		realm.setVerifyEmail(verifyEmail);
-		em.flush();
-	}
-
-	@Override
-	public boolean isResetPasswordAllowed() {
-		return realm.isResetPasswordAllowed();
-	}
-
-	@Override
-	public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
-		realm.setResetPasswordAllowed(resetPasswordAllowed);
-		em.flush();
-	}
-
-	@Override
-	public int getNotBefore() {
-		return realm.getNotBefore();
-	}
-
-	@Override
-	public void setNotBefore(int notBefore) {
-		realm.setNotBefore(notBefore);
-	}
-
-	@Override
-	public int getAccessTokenLifespan() {
-		return realm.getAccessTokenLifespan();
-	}
-
-	@Override
-	public void setAccessTokenLifespan(int tokenLifespan) {
-		realm.setAccessTokenLifespan(tokenLifespan);
-		em.flush();
-	}
-
-	@Override
-	public int getSsoSessionIdleTimeout() {
-		return realm.getSsoSessionIdleTimeout();
-	}
-
-	@Override
-	public void setSsoSessionIdleTimeout(int seconds) {
-		realm.setSsoSessionIdleTimeout(seconds);
-	}
-
-	@Override
-	public int getSsoSessionMaxLifespan() {
-		return realm.getSsoSessionMaxLifespan();
-	}
-
-	@Override
-	public void setSsoSessionMaxLifespan(int seconds) {
-		realm.setSsoSessionMaxLifespan(seconds);
-	}
-
-	@Override
-	public int getAccessCodeLifespan() {
-		return realm.getAccessCodeLifespan();
-	}
-
-	@Override
-	public void setAccessCodeLifespan(int accessCodeLifespan) {
-		realm.setAccessCodeLifespan(accessCodeLifespan);
-		em.flush();
-	}
-
-	@Override
-	public int getAccessCodeLifespanUserAction() {
-		return realm.getAccessCodeLifespanUserAction();
-	}
-
-	@Override
-	public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
-		realm.setAccessCodeLifespanUserAction(accessCodeLifespanUserAction);
-		em.flush();
-	}
-
-	@Override
-	public int getAccessCodeLifespanLogin() {
-		return realm.getAccessCodeLifespanLogin();
-	}
-
-	@Override
-	public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
-		realm.setAccessCodeLifespanLogin(accessCodeLifespanLogin);
-		em.flush();
-	}
-
-	@Override
-	public String getPublicKeyPem() {
-		return realm.getPublicKeyPem();
-	}
-
-	@Override
-	public void setPublicKeyPem(String publicKeyPem) {
-		realm.setPublicKeyPem(publicKeyPem);
-		em.flush();
-	}
-
-	@Override
-	public X509Certificate getCertificate() {
-		if (certificate != null)
-			return certificate;
-		certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
-		return certificate;
-	}
-
-	@Override
-	public void setCertificate(X509Certificate certificate) {
-		this.certificate = certificate;
-		String certificatePem = KeycloakModelUtils.getPemFromCertificate(certificate);
-		setCertificatePem(certificatePem);
-
-	}
-
-	@Override
-	public String getCertificatePem() {
-		return realm.getCertificatePem();
-	}
-
-	@Override
-	public void setCertificatePem(String certificate) {
-		realm.setCertificatePem(certificate);
-
-	}
-
-	@Override
-	public String getPrivateKeyPem() {
-		return realm.getPrivateKeyPem();
-	}
-
-	@Override
-	public void setPrivateKeyPem(String privateKeyPem) {
-		realm.setPrivateKeyPem(privateKeyPem);
-		em.flush();
-	}
-
-	@Override
-	public PublicKey getPublicKey() {
-		if (publicKey != null)
-			return publicKey;
-		publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
-		return publicKey;
-	}
-
-	@Override
-	public void setPublicKey(PublicKey publicKey) {
-		this.publicKey = publicKey;
-		String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
-		setPublicKeyPem(publicKeyPem);
-	}
-
-	@Override
-	public PrivateKey getPrivateKey() {
-		if (privateKey != null)
-			return privateKey;
-		privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
-		return privateKey;
-	}
-
-	@Override
-	public void setPrivateKey(PrivateKey privateKey) {
-		this.privateKey = privateKey;
-		String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
-		setPrivateKeyPem(privateKeyPem);
-	}
-
-	@Override
-	public String getCodeSecret() {
-		return realm.getCodeSecret();
-	}
-
-	@Override
-	public Key getCodeSecretKey() {
-		if (codeSecretKey == null) {
-			codeSecretKey = KeycloakModelUtils.getSecretKey(getCodeSecret());
-		}
-		return codeSecretKey;
-	}
-
-	@Override
-	public void setCodeSecret(String codeSecret) {
-		realm.setCodeSecret(codeSecret);
-	}
-
-	protected RequiredCredentialModel initRequiredCredentialModel(String type) {
-		RequiredCredentialModel model = RequiredCredentialModel.BUILT_IN.get(type);
-		if (model == null) {
-			throw new RuntimeException("Unknown credential type " + type);
-		}
-		return model;
-	}
-
-	@Override
-	public void addRequiredCredential(String type) {
-		RequiredCredentialModel model = initRequiredCredentialModel(type);
-		addRequiredCredential(model);
-		em.flush();
-	}
-
-	public void addRequiredCredential(RequiredCredentialModel model) {
-		RequiredCredentialEntity entity = new RequiredCredentialEntity();
-		entity.setRealm(realm);
-		entity.setInput(model.isInput());
-		entity.setSecret(model.isSecret());
-		entity.setType(model.getType());
-		entity.setFormLabel(model.getFormLabel());
-		em.persist(entity);
-		realm.getRequiredCredentials().add(entity);
-		em.flush();
-	}
-
-	@Override
-	public void updateRequiredCredentials(Set<String> creds) {
-		Collection<RequiredCredentialEntity> relationships = realm.getRequiredCredentials();
-		if (relationships == null)
-			relationships = new ArrayList<RequiredCredentialEntity>();
-
-		Set<String> already = new HashSet<String>();
-		List<RequiredCredentialEntity> remove = new ArrayList<RequiredCredentialEntity>();
-		for (RequiredCredentialEntity rel : relationships) {
-			if (!creds.contains(rel.getType())) {
-				remove.add(rel);
-			} else {
-				already.add(rel.getType());
-			}
-		}
-		for (RequiredCredentialEntity entity : remove) {
-			relationships.remove(entity);
-			em.remove(entity);
-		}
-		for (String cred : creds) {
-			if (!already.contains(cred)) {
-				addRequiredCredential(cred);
-			}
-		}
-		em.flush();
-	}
-
-	@Override
-	public List<RequiredCredentialModel> getRequiredCredentials() {
-		List<RequiredCredentialModel> requiredCredentialModels = new ArrayList<RequiredCredentialModel>();
-		Collection<RequiredCredentialEntity> entities = realm.getRequiredCredentials();
-		if (entities == null)
-			return requiredCredentialModels;
-		for (RequiredCredentialEntity entity : entities) {
-			RequiredCredentialModel model = new RequiredCredentialModel();
-			model.setFormLabel(entity.getFormLabel());
-			model.setType(entity.getType());
-			model.setSecret(entity.isSecret());
-			model.setInput(entity.isInput());
-			requiredCredentialModels.add(model);
-		}
-		return requiredCredentialModels; // To change body of implemented methods use File | Settings | File Templates.
-	}
-
-	@Override
-	public List<String> getDefaultRoles() {
-		Collection<RoleEntity> entities = realm.getDefaultRoles();
-		List<String> roles = new ArrayList<String>();
-		if (entities == null)
-			return roles;
-		for (RoleEntity entity : entities) {
-			roles.add(entity.getName());
-		}
-		return roles;
-	}
-
-	@Override
-	public void addDefaultRole(String name) {
-		RoleModel role = getRole(name);
-		if (role == null) {
-			role = addRole(name);
-		}
-		Collection<RoleEntity> entities = realm.getDefaultRoles();
-		for (RoleEntity entity : entities) {
-			if (entity.getId().equals(role.getId())) {
-				return;
-			}
-		}
-		RoleEntity roleEntity = RoleAdapter.toRoleEntity(role, em);
-		entities.add(roleEntity);
-		em.flush();
-	}
-
-	public static boolean contains(String str, String[] array) {
-		for (String s : array) {
-			if (str.equals(s))
-				return true;
-		}
-		return false;
-	}
-
-	@Override
-	public void updateDefaultRoles(String[] defaultRoles) {
-		Collection<RoleEntity> entities = realm.getDefaultRoles();
-		Set<String> already = new HashSet<String>();
-		List<RoleEntity> remove = new ArrayList<RoleEntity>();
-		for (RoleEntity rel : entities) {
-			if (!contains(rel.getName(), defaultRoles)) {
-				remove.add(rel);
-			} else {
-				already.add(rel.getName());
-			}
-		}
-		for (RoleEntity entity : remove) {
-			entities.remove(entity);
-		}
-		em.flush();
-		for (String roleName : defaultRoles) {
-			if (!already.contains(roleName)) {
-				addDefaultRole(roleName);
-			}
-		}
-		em.flush();
-	}
-
-	@Override
-	public ClientModel findClient(String clientId) {
-		ClientModel model = getApplicationByName(clientId);
-		if (model != null)
-			return model;
-		return getOAuthClient(clientId);
-	}
-
-	@Override
-	public ClientModel findClientById(String id) {
-		ClientModel model = getApplicationById(id);
-		if (model != null)
-			return model;
-		return getOAuthClientById(id);
-	}
-
-	@Override
-	public Map<String, ApplicationModel> getApplicationNameMap() {
-		Map<String, ApplicationModel> map = new HashMap<String, ApplicationModel>();
-		for (ApplicationModel app : getApplications()) {
-			map.put(app.getName(), app);
-		}
-		return map; // To change body of implemented methods use File | Settings | File Templates.
-	}
-
-	@Override
-	public List<ApplicationModel> getApplications() {
-		List<ApplicationModel> list = new ArrayList<ApplicationModel>();
-		if (realm.getApplications() == null)
-			return list;
-		for (ApplicationEntity entity : realm.getApplications()) {
-			list.add(new ApplicationAdapter(this, em, session, entity));
-		}
-		return list;
-	}
-
-	@Override
-	public ApplicationModel addApplication(String name) {
-		return this.addApplication(KeycloakModelUtils.generateId(), name);
-	}
-
-	@Override
-	public ApplicationModel addApplication(String id, String name) {
-		ApplicationEntity applicationData = new ApplicationEntity();
-		applicationData.setId(id);
-		applicationData.setName(name);
-		applicationData.setEnabled(true);
-		applicationData.setRealm(realm);
-		realm.getApplications().add(applicationData);
-		em.persist(applicationData);
-		em.flush();
-		final ApplicationModel resource = new ApplicationAdapter(this, em, session, applicationData);
-		em.flush();
-		session.getKeycloakSessionFactory().publish(new ApplicationCreationEvent() {
-			@Override
-			public ApplicationModel getCreatedApplication() {
-				return resource;
-			}
-
-			@Override
-			public ClientModel getCreatedClient() {
-				return resource;
-			}
-		});
-		return resource;
-	}
-
-	@Override
-	public boolean removeApplication(String id) {
-		if (id == null)
-			return false;
-		ApplicationModel application = getApplicationById(id);
-		if (application == null)
-			return false;
-
-		for (RoleModel role : application.getRoles()) {
-			application.removeRole(role);
-		}
-
-		ApplicationEntity applicationEntity = null;
-		Iterator<ApplicationEntity> it = realm.getApplications().iterator();
-		while (it.hasNext()) {
-			ApplicationEntity ae = it.next();
-			if (ae.getId().equals(id)) {
-				applicationEntity = ae;
-				it.remove();
-				break;
-			}
-		}
-		for (ApplicationEntity a : realm.getApplications()) {
-			if (a.getId().equals(id)) {
-				applicationEntity = a;
-			}
-		}
-		if (application == null) {
-			return false;
-		}
-		em.remove(applicationEntity);
-		em.createNamedQuery("deleteScopeMappingByClient").setParameter("client", applicationEntity).executeUpdate();
-		em.flush();
-
-		return true;
-	}
-
-	@Override
-	public ApplicationModel getApplicationById(String id) {
-		return session.realms().getApplicationById(id, this);
-	}
-
-	@Override
-	public ApplicationModel getApplicationByName(String name) {
-		return getApplicationNameMap().get(name);
-	}
-
-	@Override
-	public OAuthClientModel addOAuthClient(String name) {
-		return this.addOAuthClient(KeycloakModelUtils.generateId(), name);
-	}
-
-	@Override
-	public OAuthClientModel addOAuthClient(String id, String name) {
-		OAuthClientEntity data = new OAuthClientEntity();
-		data.setId(id);
-		data.setEnabled(true);
-		data.setName(name);
-		data.setRealm(realm);
-		em.persist(data);
-		em.flush();
-		final OAuthClientModel model = new OAuthClientAdapter(this, data, em);
-		em.flush();
-		session.getKeycloakSessionFactory().publish(new OAuthClientCreationEvent() {
-			@Override
-			public OAuthClientModel getCreatedOAuthClient() {
-				return model;
-			}
-
-			@Override
-			public ClientModel getCreatedClient() {
-				return model;
-			}
-		});
-		return model;
-	}
-
-	@Override
-	public boolean removeOAuthClient(String id) {
-		OAuthClientModel oauth = getOAuthClientById(id);
-		if (oauth == null)
-			return false;
-		OAuthClientEntity client = em.getReference(OAuthClientEntity.class, oauth.getId());
-		em.createNamedQuery("deleteScopeMappingByClient").setParameter("client", client).executeUpdate();
-		em.remove(client);
-		return true;
-	}
-
-	@Override
-	public OAuthClientModel getOAuthClient(String name) {
-		TypedQuery<OAuthClientEntity> query = em.createNamedQuery("findOAuthClientByName", OAuthClientEntity.class);
-		query.setParameter("name", name);
-		query.setParameter("realm", realm);
-		List<OAuthClientEntity> entities = query.getResultList();
-		if (entities.size() == 0)
-			return null;
-		return new OAuthClientAdapter(this, entities.get(0), em);
-	}
-
-	@Override
-	public OAuthClientModel getOAuthClientById(String id) {
-		return session.realms().getOAuthClientById(id, this);
-	}
-
-	@Override
-	public List<OAuthClientModel> getOAuthClients() {
-		TypedQuery<OAuthClientEntity> query = em.createNamedQuery("findOAuthClientByRealm", OAuthClientEntity.class);
-		query.setParameter("realm", realm);
-		List<OAuthClientEntity> entities = query.getResultList();
-		List<OAuthClientModel> list = new ArrayList<OAuthClientModel>();
-		for (OAuthClientEntity entity : entities)
-			list.add(new OAuthClientAdapter(this, entity, em));
-		return list;
-	}
-
-	private static final String BROWSER_HEADER_PREFIX = "_browser_header.";
-
-	@Override
-	public Map<String, String> getBrowserSecurityHeaders() {
-		Map<String, String> attributes = getAttributes();
-		Map<String, String> headers = new HashMap<String, String>();
-		for (Map.Entry<String, String> entry : attributes.entrySet()) {
-			if (entry.getKey().startsWith(BROWSER_HEADER_PREFIX)) {
-				headers.put(entry.getKey().substring(BROWSER_HEADER_PREFIX.length()), entry.getValue());
-			}
-		}
-		return headers;
-	}
-
-	@Override
-	public void setBrowserSecurityHeaders(Map<String, String> headers) {
-		for (Map.Entry<String, String> entry : headers.entrySet()) {
-			setAttribute(BROWSER_HEADER_PREFIX + entry.getKey(), entry.getValue());
-		}
-	}
-
-	@Override
-	public Map<String, String> getSmtpConfig() {
-		return realm.getSmtpConfig();
-	}
-
-	@Override
-	public void setSmtpConfig(Map<String, String> smtpConfig) {
-		realm.setSmtpConfig(smtpConfig);
-		em.flush();
-	}
-
-	@Override
-	public List<UserFederationProviderModel> getUserFederationProviders() {
-		List<UserFederationProviderEntity> entities = realm.getUserFederationProviders();
-		List<UserFederationProviderEntity> copy = new ArrayList<UserFederationProviderEntity>();
-		for (UserFederationProviderEntity entity : entities) {
-			copy.add(entity);
-
-		}
-		Collections.sort(copy, new Comparator<UserFederationProviderEntity>() {
-
-			@Override
-			public int compare(UserFederationProviderEntity o1, UserFederationProviderEntity o2) {
-				return o1.getPriority() - o2.getPriority();
-			}
-
-		});
-		List<UserFederationProviderModel> result = new ArrayList<UserFederationProviderModel>();
-		for (UserFederationProviderEntity entity : copy) {
-			result.add(new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
-					.getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(), entity
-					.getLastSync()));
-		}
-
-		return result;
-	}
-
-	@Override
-	public UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config,
-			int priority, String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync) {
-		String id = KeycloakModelUtils.generateId();
-		UserFederationProviderEntity entity = new UserFederationProviderEntity();
-		entity.setId(id);
-		entity.setRealm(realm);
-		entity.setProviderName(providerName);
-		entity.setConfig(config);
-		entity.setPriority(priority);
-		if (displayName == null) {
-			displayName = id;
-		}
-		entity.setDisplayName(displayName);
-		entity.setFullSyncPeriod(fullSyncPeriod);
-		entity.setChangedSyncPeriod(changedSyncPeriod);
-		entity.setLastSync(lastSync);
-		em.persist(entity);
-		realm.getUserFederationProviders().add(entity);
-		em.flush();
-		return new UserFederationProviderModel(entity.getId(), providerName, config, priority, displayName, fullSyncPeriod,
-				changedSyncPeriod, lastSync);
-	}
-
-	@Override
-	public void removeUserFederationProvider(UserFederationProviderModel provider) {
-		Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
-		while (it.hasNext()) {
-			UserFederationProviderEntity entity = it.next();
-			if (entity.getId().equals(provider.getId())) {
-				session.users().preRemove(this, provider);
-				it.remove();
-				em.remove(entity);
-				return;
-			}
-		}
-	}
-
-	@Override
-	public void updateUserFederationProvider(UserFederationProviderModel model) {
-		Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
-		while (it.hasNext()) {
-			UserFederationProviderEntity entity = it.next();
-			if (entity.getId().equals(model.getId())) {
-				String displayName = model.getDisplayName();
-				if (displayName != null) {
-					entity.setDisplayName(model.getDisplayName());
-				}
-				entity.setConfig(model.getConfig());
-				entity.setPriority(model.getPriority());
-				entity.setProviderName(model.getProviderName());
-				entity.setPriority(model.getPriority());
-				entity.setFullSyncPeriod(model.getFullSyncPeriod());
-				entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
-				entity.setLastSync(model.getLastSync());
-				break;
-			}
-		}
-	}
-
-	@Override
-	public void setUserFederationProviders(List<UserFederationProviderModel> providers) {
-
-		Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
-		while (it.hasNext()) {
-			UserFederationProviderEntity entity = it.next();
-			boolean found = false;
-			for (UserFederationProviderModel model : providers) {
-				if (entity.getId().equals(model.getId())) {
-					entity.setConfig(model.getConfig());
-					entity.setPriority(model.getPriority());
-					entity.setProviderName(model.getProviderName());
-					entity.setPriority(model.getPriority());
-					String displayName = model.getDisplayName();
-					if (displayName != null) {
-						entity.setDisplayName(model.getDisplayName());
-					}
-					entity.setFullSyncPeriod(model.getFullSyncPeriod());
-					entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
-					entity.setLastSync(model.getLastSync());
-					found = true;
-					break;
-				}
-
-			}
-			if (found)
-				continue;
-			session.users().preRemove(
-					this,
-					new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
-							.getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(),
-							entity.getLastSync()));
-			it.remove();
-			em.remove(entity);
-		}
-
-		List<UserFederationProviderModel> add = new LinkedList<UserFederationProviderModel>();
-		for (UserFederationProviderModel model : providers) {
-			boolean found = false;
-			for (UserFederationProviderEntity entity : realm.getUserFederationProviders()) {
-				if (entity.getId().equals(model.getId())) {
-					found = true;
-					break;
-				}
-			}
-			if (!found)
-				add.add(model);
-		}
-
-		for (UserFederationProviderModel model : add) {
-			UserFederationProviderEntity entity = new UserFederationProviderEntity();
-			if (model.getId() != null)
-				entity.setId(model.getId());
-			else
-				entity.setId(KeycloakModelUtils.generateId());
-			entity.setConfig(model.getConfig());
-			entity.setPriority(model.getPriority());
-			entity.setProviderName(model.getProviderName());
-			entity.setPriority(model.getPriority());
-			String displayName = model.getDisplayName();
-			if (displayName == null) {
-				displayName = entity.getId();
-			}
-			entity.setDisplayName(displayName);
-			entity.setFullSyncPeriod(model.getFullSyncPeriod());
-			entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
-			entity.setLastSync(model.getLastSync());
-			em.persist(entity);
-			realm.getUserFederationProviders().add(entity);
-
-		}
-	}
-
-	@Override
-	public RoleModel getRole(String name) {
-		TypedQuery<RoleEntity> query = em.createNamedQuery("getRealmRoleByName", RoleEntity.class);
-		query.setParameter("name", name);
-		query.setParameter("realm", realm);
-		List<RoleEntity> roles = query.getResultList();
-		if (roles.size() == 0)
-			return null;
-		return new RoleAdapter(this, em, roles.get(0));
-	}
-
-	@Override
-	public RoleModel addRole(String name) {
-		return this.addRole(KeycloakModelUtils.generateId(), name);
-	}
-
-	@Override
-	public RoleModel addRole(String id, String name) {
-		RoleEntity entity = new RoleEntity();
-		entity.setId(id);
-		entity.setName(name);
-		entity.setRealm(realm);
-		entity.setRealmId(realm.getId());
-		realm.getRoles().add(entity);
-		em.persist(entity);
-		em.flush();
-		return new RoleAdapter(this, em, entity);
-	}
-
-	@Override
-	public boolean removeRole(RoleModel role) {
-		if (role == null) {
-			return false;
-		}
-		if (!role.getContainer().equals(this))
-			return false;
-		session.users().preRemove(this, role);
-		RoleEntity roleEntity = RoleAdapter.toRoleEntity(role, em);
-		realm.getRoles().remove(role);
-		realm.getDefaultRoles().remove(role);
-
-		em.createNativeQuery("delete from COMPOSITE_ROLE where CHILD_ROLE = :role").setParameter("role", roleEntity)
-				.executeUpdate();
-		em.createNamedQuery("deleteScopeMappingByRole").setParameter("role", roleEntity).executeUpdate();
-
-		em.remove(roleEntity);
-
-		return true;
-	}
-
-	@Override
-	public Set<RoleModel> getRoles() {
-		Set<RoleModel> list = new HashSet<RoleModel>();
-		Collection<RoleEntity> roles = realm.getRoles();
-		if (roles == null)
-			return list;
-		for (RoleEntity entity : roles) {
-			list.add(new RoleAdapter(this, em, entity));
-		}
-		return list;
-	}
-
-	@Override
-	public RoleModel getRoleById(String id) {
-		return session.realms().getRoleById(id, this);
-	}
-
-	@Override
-	public boolean removeRoleById(String id) {
-		RoleModel role = getRoleById(id);
-		if (role == null)
-			return false;
-		return role.getContainer().removeRole(role);
-	}
-
-	@Override
-	public PasswordPolicy getPasswordPolicy() {
-		if (passwordPolicy == null) {
-			passwordPolicy = new PasswordPolicy(realm.getPasswordPolicy());
-		}
-		return passwordPolicy;
-	}
-
-	@Override
-	public void setPasswordPolicy(PasswordPolicy policy) {
-		this.passwordPolicy = policy;
-		realm.setPasswordPolicy(policy.toString());
-		em.flush();
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if (this == o)
-			return true;
-		if (o == null || !(o instanceof RealmModel))
-			return false;
-
-		RealmModel that = (RealmModel) o;
-		return that.getId().equals(getId());
-	}
-
-	@Override
-	public int hashCode() {
-		return getId().hashCode();
-	}
-
-	@Override
-	public String getLoginTheme() {
-		return realm.getLoginTheme();
-	}
-
-	@Override
-	public void setLoginTheme(String name) {
-		realm.setLoginTheme(name);
-		em.flush();
-	}
-
-	@Override
-	public String getAccountTheme() {
-		return realm.getAccountTheme();
-	}
-
-	@Override
-	public void setAccountTheme(String name) {
-		realm.setAccountTheme(name);
-		em.flush();
-	}
-
-	@Override
-	public String getAdminTheme() {
-		return realm.getAdminTheme();
-	}
-
-	@Override
-	public void setAdminTheme(String name) {
-		realm.setAdminTheme(name);
-		em.flush();
-	}
-
-	@Override
-	public String getEmailTheme() {
-		return realm.getEmailTheme();
-	}
-
-	@Override
-	public void setEmailTheme(String name) {
-		realm.setEmailTheme(name);
-		em.flush();
-	}
-
-	@Override
-	public boolean isEventsEnabled() {
-		return realm.isEventsEnabled();
-	}
-
-	@Override
-	public void setEventsEnabled(boolean enabled) {
-		realm.setEventsEnabled(enabled);
-		em.flush();
-	}
-
-	@Override
-	public long getEventsExpiration() {
-		return realm.getEventsExpiration();
-	}
-
-	@Override
-	public void setEventsExpiration(long expiration) {
-		realm.setEventsExpiration(expiration);
-		em.flush();
-	}
-
-	@Override
-	public Set<String> getEventsListeners() {
-		return realm.getEventsListeners();
-	}
-
-	@Override
-	public void setEventsListeners(Set<String> listeners) {
-		realm.setEventsListeners(listeners);
-		em.flush();
-	}
-
-	@Override
-	public ApplicationModel getMasterAdminApp() {
-		return new ApplicationAdapter(this, em, session, realm.getMasterAdminApp());
-	}
-
-	@Override
-	public void setMasterAdminApp(ApplicationModel app) {
-		ApplicationEntity appEntity = app != null ? em.getReference(ApplicationEntity.class, app.getId()) : null;
-		realm.setMasterAdminApp(appEntity);
-		em.flush();
-	}
-
-	@Override
-	public List<IdentityProviderModel> getIdentityProviders() {
-		List<IdentityProviderModel> identityProviders = new ArrayList<IdentityProviderModel>();
-
-		for (IdentityProviderEntity entity : realm.getIdentityProviders()) {
-			IdentityProviderModel identityProviderModel = new IdentityProviderModel();
-
-			identityProviderModel.setProviderId(entity.getProviderId());
-			identityProviderModel.setId(entity.getId());
-			identityProviderModel.setInternalId(entity.getInternalId());
-			identityProviderModel.setName(entity.getName());
-			identityProviderModel.setConfig(entity.getConfig());
-			identityProviderModel.setEnabled(entity.isEnabled());
-			identityProviderModel.setUpdateProfileFirstLogin(entity.isUpdateProfileFirstLogin());
-			identityProviderModel.setAuthenticateByDefault(entity.isAuthenticateByDefault());
-			identityProviderModel.setStoreToken(entity.isStoreToken());
-
-			identityProviders.add(identityProviderModel);
-		}
-
-		return identityProviders;
-	}
-
-	@Override
-	public IdentityProviderModel getIdentityProviderById(String identityProviderId) {
-		for (IdentityProviderModel identityProviderModel : getIdentityProviders()) {
-			if (identityProviderModel.getId().equals(identityProviderId)) {
-				return identityProviderModel;
-			}
-		}
-
-		return null;
-	}
-
-	@Override
-	public void addIdentityProvider(IdentityProviderModel identityProvider) {
-		IdentityProviderEntity entity = new IdentityProviderEntity();
-
-		entity.setInternalId(KeycloakModelUtils.generateId());
-		entity.setId(identityProvider.getId());
-		entity.setProviderId(identityProvider.getProviderId());
-		entity.setName(identityProvider.getName());
-		entity.setEnabled(identityProvider.isEnabled());
-		entity.setStoreToken(identityProvider.isStoreToken());
-		entity.setUpdateProfileFirstLogin(identityProvider.isUpdateProfileFirstLogin());
-		entity.setAuthenticateByDefault(identityProvider.isAuthenticateByDefault());
-		entity.setConfig(identityProvider.getConfig());
-
-		realm.addIdentityProvider(entity);
-
-		em.persist(entity);
-		em.flush();
-	}
-
-	@Override
-	public void removeIdentityProviderById(String providerId) {
-		for (IdentityProviderEntity entity : realm.getIdentityProviders()) {
-			if (entity.getId().equals(providerId)) {
-				em.remove(entity);
-				em.flush();
-			}
-		}
-	}
-
-	@Override
-	public void updateIdentityProvider(IdentityProviderModel identityProvider) {
-		for (IdentityProviderEntity entity : this.realm.getIdentityProviders()) {
-			if (entity.getInternalId().equals(identityProvider.getInternalId())) {
-				entity.setId(identityProvider.getId());
-				entity.setName(identityProvider.getName());
-				entity.setEnabled(identityProvider.isEnabled());
-				entity.setUpdateProfileFirstLogin(identityProvider.isUpdateProfileFirstLogin());
-				entity.setAuthenticateByDefault(identityProvider.isAuthenticateByDefault());
-				entity.setStoreToken(identityProvider.isStoreToken());
-				entity.setConfig(identityProvider.getConfig());
-			}
-		}
-
-		em.flush();
-	}
-
-	@Override
-	public boolean isIdentityFederationEnabled() {
-		return !this.realm.getIdentityProviders().isEmpty();
-	}
+    protected RealmEntity realm;
+    protected EntityManager em;
+    protected volatile transient PublicKey publicKey;
+    protected volatile transient PrivateKey privateKey;
+    protected volatile transient X509Certificate certificate;
+    protected volatile transient Key codeSecretKey;
+    protected KeycloakSession session;
+    private PasswordPolicy passwordPolicy;
+
+    public RealmAdapter(KeycloakSession session, EntityManager em, RealmEntity realm) {
+        this.session = session;
+        this.em = em;
+        this.realm = realm;
+    }
+
+    public RealmEntity getEntity() {
+        return realm;
+    }
+
+    @Override
+    public String getId() {
+        return realm.getId();
+    }
+
+    @Override
+    public String getName() {
+        return realm.getName();
+    }
+
+    @Override
+    public void setName(String name) {
+        realm.setName(name);
+        em.flush();
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return realm.isEnabled();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        realm.setEnabled(enabled);
+        em.flush();
+    }
+
+    @Override
+    public SslRequired getSslRequired() {
+        return realm.getSslRequired() != null ? SslRequired.valueOf(realm.getSslRequired()) : null;
+    }
+
+    @Override
+    public void setSslRequired(SslRequired sslRequired) {
+        realm.setSslRequired(sslRequired.name());
+        em.flush();
+    }
+
+    @Override
+    public boolean isPasswordCredentialGrantAllowed() {
+        return realm.isPasswordCredentialGrantAllowed();
+    }
+
+    @Override
+    public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
+        realm.setPasswordCredentialGrantAllowed(passwordCredentialGrantAllowed);
+        em.flush();
+    }
+
+    @Override
+    public boolean isRegistrationAllowed() {
+        return realm.isRegistrationAllowed();
+    }
+
+    @Override
+    public void setRegistrationAllowed(boolean registrationAllowed) {
+        realm.setRegistrationAllowed(registrationAllowed);
+        em.flush();
+    }
+
+    @Override
+    public boolean isRegistrationEmailAsUsername() {
+        return realm.isRegistrationEmailAsUsername();
+    }
+
+    @Override
+    public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
+        realm.setRegistrationEmailAsUsername(registrationEmailAsUsername);
+        em.flush();
+    }
+
+    @Override
+    public boolean isRememberMe() {
+        return realm.isRememberMe();
+    }
+
+    @Override
+    public void setRememberMe(boolean rememberMe) {
+        realm.setRememberMe(rememberMe);
+        em.flush();
+    }
+
+    public void setAttribute(String name, String value) {
+        for (RealmAttributeEntity attr : realm.getAttributes()) {
+            if (attr.getName().equals(name)) {
+                attr.setValue(value);
+                return;
+            }
+        }
+        RealmAttributeEntity attr = new RealmAttributeEntity();
+        attr.setName(name);
+        attr.setValue(value);
+        attr.setRealm(realm);
+        em.persist(attr);
+        realm.getAttributes().add(attr);
+    }
+
+    public void setAttribute(String name, Boolean value) {
+        setAttribute(name, value.toString());
+    }
+
+    public void setAttribute(String name, Integer value) {
+        setAttribute(name, value.toString());
+    }
+
+    public void setAttribute(String name, Long value) {
+        setAttribute(name, value.toString());
+    }
+
+    public void removeAttribute(String name) {
+        Iterator<RealmAttributeEntity> it = realm.getAttributes().iterator();
+        while (it.hasNext()) {
+            RealmAttributeEntity attr = it.next();
+            if (attr.getName().equals(name)) {
+                it.remove();
+                em.remove(attr);
+            }
+        }
+    }
+
+    public String getAttribute(String name) {
+        for (RealmAttributeEntity attr : realm.getAttributes()) {
+            if (attr.getName().equals(name)) {
+                return attr.getValue();
+            }
+        }
+        return null;
+    }
+
+    public Integer getAttribute(String name, Integer defaultValue) {
+        String v = getAttribute(name);
+        return v != null ? Integer.parseInt(v) : defaultValue;
+
+    }
+
+    public Long getAttribute(String name, Long defaultValue) {
+        String v = getAttribute(name);
+        return v != null ? Long.parseLong(v) : defaultValue;
+
+    }
+
+    public Boolean getAttribute(String name, Boolean defaultValue) {
+        String v = getAttribute(name);
+        return v != null ? Boolean.parseBoolean(v) : defaultValue;
+
+    }
+
+    public Map<String, String> getAttributes() {
+        // should always return a copy
+        Map<String, String> result = new HashMap<String, String>();
+        for (RealmAttributeEntity attr : realm.getAttributes()) {
+            result.put(attr.getName(), attr.getValue());
+        }
+        return result;
+    }
+
+    @Override
+    public boolean isBruteForceProtected() {
+        return getAttribute("bruteForceProtected", false);
+    }
+
+    @Override
+    public void setBruteForceProtected(boolean value) {
+        setAttribute("bruteForceProtected", value);
+    }
+
+    @Override
+    public int getMaxFailureWaitSeconds() {
+        return getAttribute("maxFailureWaitSeconds", 0);
+    }
+
+    @Override
+    public void setMaxFailureWaitSeconds(int val) {
+        setAttribute("maxFailureWaitSeconds", val);
+    }
+
+    @Override
+    public int getWaitIncrementSeconds() {
+        return getAttribute("waitIncrementSeconds", 0);
+    }
+
+    @Override
+    public void setWaitIncrementSeconds(int val) {
+        setAttribute("waitIncrementSeconds", val);
+    }
+
+    @Override
+    public long getQuickLoginCheckMilliSeconds() {
+        return getAttribute("quickLoginCheckMilliSeconds", 0l);
+    }
+
+    @Override
+    public void setQuickLoginCheckMilliSeconds(long val) {
+        setAttribute("quickLoginCheckMilliSeconds", val);
+    }
+
+    @Override
+    public int getMinimumQuickLoginWaitSeconds() {
+        return getAttribute("minimumQuickLoginWaitSeconds", 0);
+    }
+
+    @Override
+    public void setMinimumQuickLoginWaitSeconds(int val) {
+        setAttribute("minimumQuickLoginWaitSeconds", val);
+    }
+
+    @Override
+    public int getMaxDeltaTimeSeconds() {
+        return getAttribute("maxDeltaTimeSeconds", 0);
+    }
+
+    @Override
+    public void setMaxDeltaTimeSeconds(int val) {
+        setAttribute("maxDeltaTimeSeconds", val);
+    }
+
+    @Override
+    public int getFailureFactor() {
+        return getAttribute("failureFactor", 0);
+    }
+
+    @Override
+    public void setFailureFactor(int failureFactor) {
+        setAttribute("failureFactor", failureFactor);
+    }
+
+    @Override
+    public boolean isVerifyEmail() {
+        return realm.isVerifyEmail();
+    }
+
+    @Override
+    public void setVerifyEmail(boolean verifyEmail) {
+        realm.setVerifyEmail(verifyEmail);
+        em.flush();
+    }
+
+    @Override
+    public boolean isResetPasswordAllowed() {
+        return realm.isResetPasswordAllowed();
+    }
+
+    @Override
+    public void setResetPasswordAllowed(boolean resetPasswordAllowed) {
+        realm.setResetPasswordAllowed(resetPasswordAllowed);
+        em.flush();
+    }
+
+    @Override
+    public int getNotBefore() {
+        return realm.getNotBefore();
+    }
+
+    @Override
+    public void setNotBefore(int notBefore) {
+        realm.setNotBefore(notBefore);
+    }
+
+    @Override
+    public int getAccessTokenLifespan() {
+        return realm.getAccessTokenLifespan();
+    }
+
+    @Override
+    public void setAccessTokenLifespan(int tokenLifespan) {
+        realm.setAccessTokenLifespan(tokenLifespan);
+        em.flush();
+    }
+
+    @Override
+    public int getSsoSessionIdleTimeout() {
+        return realm.getSsoSessionIdleTimeout();
+    }
+
+    @Override
+    public void setSsoSessionIdleTimeout(int seconds) {
+        realm.setSsoSessionIdleTimeout(seconds);
+    }
+
+    @Override
+    public int getSsoSessionMaxLifespan() {
+        return realm.getSsoSessionMaxLifespan();
+    }
+
+    @Override
+    public void setSsoSessionMaxLifespan(int seconds) {
+        realm.setSsoSessionMaxLifespan(seconds);
+    }
+
+    @Override
+    public int getAccessCodeLifespan() {
+        return realm.getAccessCodeLifespan();
+    }
+
+    @Override
+    public void setAccessCodeLifespan(int accessCodeLifespan) {
+        realm.setAccessCodeLifespan(accessCodeLifespan);
+        em.flush();
+    }
+
+    @Override
+    public int getAccessCodeLifespanUserAction() {
+        return realm.getAccessCodeLifespanUserAction();
+    }
+
+    @Override
+    public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
+        realm.setAccessCodeLifespanUserAction(accessCodeLifespanUserAction);
+        em.flush();
+    }
+
+    @Override
+    public int getAccessCodeLifespanLogin() {
+        return realm.getAccessCodeLifespanLogin();
+    }
+
+    @Override
+    public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
+        realm.setAccessCodeLifespanLogin(accessCodeLifespanLogin);
+        em.flush();
+    }
+
+    @Override
+    public String getPublicKeyPem() {
+        return realm.getPublicKeyPem();
+    }
+
+    @Override
+    public void setPublicKeyPem(String publicKeyPem) {
+        realm.setPublicKeyPem(publicKeyPem);
+        em.flush();
+    }
+
+    @Override
+    public X509Certificate getCertificate() {
+        if (certificate != null)
+            return certificate;
+        certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
+        return certificate;
+    }
+
+    @Override
+    public void setCertificate(X509Certificate certificate) {
+        this.certificate = certificate;
+        String certificatePem = KeycloakModelUtils.getPemFromCertificate(certificate);
+        setCertificatePem(certificatePem);
+
+    }
+
+    @Override
+    public String getCertificatePem() {
+        return realm.getCertificatePem();
+    }
+
+    @Override
+    public void setCertificatePem(String certificate) {
+        realm.setCertificatePem(certificate);
+
+    }
+
+    @Override
+    public String getPrivateKeyPem() {
+        return realm.getPrivateKeyPem();
+    }
+
+    @Override
+    public void setPrivateKeyPem(String privateKeyPem) {
+        realm.setPrivateKeyPem(privateKeyPem);
+        em.flush();
+    }
+
+    @Override
+    public PublicKey getPublicKey() {
+        if (publicKey != null)
+            return publicKey;
+        publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
+        return publicKey;
+    }
+
+    @Override
+    public void setPublicKey(PublicKey publicKey) {
+        this.publicKey = publicKey;
+        String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
+        setPublicKeyPem(publicKeyPem);
+    }
+
+    @Override
+    public PrivateKey getPrivateKey() {
+        if (privateKey != null)
+            return privateKey;
+        privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
+        return privateKey;
+    }
+
+    @Override
+    public void setPrivateKey(PrivateKey privateKey) {
+        this.privateKey = privateKey;
+        String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
+        setPrivateKeyPem(privateKeyPem);
+    }
+
+    @Override
+    public String getCodeSecret() {
+        return realm.getCodeSecret();
+    }
+
+    @Override
+    public Key getCodeSecretKey() {
+        if (codeSecretKey == null) {
+            codeSecretKey = KeycloakModelUtils.getSecretKey(getCodeSecret());
+        }
+        return codeSecretKey;
+    }
+
+    @Override
+    public void setCodeSecret(String codeSecret) {
+        realm.setCodeSecret(codeSecret);
+    }
+
+    protected RequiredCredentialModel initRequiredCredentialModel(String type) {
+        RequiredCredentialModel model = RequiredCredentialModel.BUILT_IN.get(type);
+        if (model == null) {
+            throw new RuntimeException("Unknown credential type " + type);
+        }
+        return model;
+    }
+
+    @Override
+    public void addRequiredCredential(String type) {
+        RequiredCredentialModel model = initRequiredCredentialModel(type);
+        addRequiredCredential(model);
+        em.flush();
+    }
+
+    public void addRequiredCredential(RequiredCredentialModel model) {
+        RequiredCredentialEntity entity = new RequiredCredentialEntity();
+        entity.setRealm(realm);
+        entity.setInput(model.isInput());
+        entity.setSecret(model.isSecret());
+        entity.setType(model.getType());
+        entity.setFormLabel(model.getFormLabel());
+        em.persist(entity);
+        realm.getRequiredCredentials().add(entity);
+        em.flush();
+    }
+
+    @Override
+    public void updateRequiredCredentials(Set<String> creds) {
+        Collection<RequiredCredentialEntity> relationships = realm.getRequiredCredentials();
+        if (relationships == null)
+            relationships = new ArrayList<RequiredCredentialEntity>();
+
+        Set<String> already = new HashSet<String>();
+        List<RequiredCredentialEntity> remove = new ArrayList<RequiredCredentialEntity>();
+        for (RequiredCredentialEntity rel : relationships) {
+            if (!creds.contains(rel.getType())) {
+                remove.add(rel);
+            } else {
+                already.add(rel.getType());
+            }
+        }
+        for (RequiredCredentialEntity entity : remove) {
+            relationships.remove(entity);
+            em.remove(entity);
+        }
+        for (String cred : creds) {
+            if (!already.contains(cred)) {
+                addRequiredCredential(cred);
+            }
+        }
+        em.flush();
+    }
+
+    @Override
+    public List<RequiredCredentialModel> getRequiredCredentials() {
+        List<RequiredCredentialModel> requiredCredentialModels = new ArrayList<RequiredCredentialModel>();
+        Collection<RequiredCredentialEntity> entities = realm.getRequiredCredentials();
+        if (entities == null)
+            return requiredCredentialModels;
+        for (RequiredCredentialEntity entity : entities) {
+            RequiredCredentialModel model = new RequiredCredentialModel();
+            model.setFormLabel(entity.getFormLabel());
+            model.setType(entity.getType());
+            model.setSecret(entity.isSecret());
+            model.setInput(entity.isInput());
+            requiredCredentialModels.add(model);
+        }
+        return requiredCredentialModels; // To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    @Override
+    public List<String> getDefaultRoles() {
+        Collection<RoleEntity> entities = realm.getDefaultRoles();
+        List<String> roles = new ArrayList<String>();
+        if (entities == null)
+            return roles;
+        for (RoleEntity entity : entities) {
+            roles.add(entity.getName());
+        }
+        return roles;
+    }
+
+    @Override
+    public void addDefaultRole(String name) {
+        RoleModel role = getRole(name);
+        if (role == null) {
+            role = addRole(name);
+        }
+        Collection<RoleEntity> entities = realm.getDefaultRoles();
+        for (RoleEntity entity : entities) {
+            if (entity.getId().equals(role.getId())) {
+                return;
+            }
+        }
+        RoleEntity roleEntity = RoleAdapter.toRoleEntity(role, em);
+        entities.add(roleEntity);
+        em.flush();
+    }
+
+    public static boolean contains(String str, String[] array) {
+        for (String s : array) {
+            if (str.equals(s))
+                return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void updateDefaultRoles(String[] defaultRoles) {
+        Collection<RoleEntity> entities = realm.getDefaultRoles();
+        Set<String> already = new HashSet<String>();
+        List<RoleEntity> remove = new ArrayList<RoleEntity>();
+        for (RoleEntity rel : entities) {
+            if (!contains(rel.getName(), defaultRoles)) {
+                remove.add(rel);
+            } else {
+                already.add(rel.getName());
+            }
+        }
+        for (RoleEntity entity : remove) {
+            entities.remove(entity);
+        }
+        em.flush();
+        for (String roleName : defaultRoles) {
+            if (!already.contains(roleName)) {
+                addDefaultRole(roleName);
+            }
+        }
+        em.flush();
+    }
+
+    @Override
+    public ClientModel findClient(String clientId) {
+        ClientModel model = getApplicationByName(clientId);
+        if (model != null)
+            return model;
+        return getOAuthClient(clientId);
+    }
+
+    @Override
+    public ClientModel findClientById(String id) {
+        ClientModel model = getApplicationById(id);
+        if (model != null)
+            return model;
+        return getOAuthClientById(id);
+    }
+
+    @Override
+    public Map<String, ApplicationModel> getApplicationNameMap() {
+        Map<String, ApplicationModel> map = new HashMap<String, ApplicationModel>();
+        for (ApplicationModel app : getApplications()) {
+            map.put(app.getName(), app);
+        }
+        return map; // To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    @Override
+    public List<ApplicationModel> getApplications() {
+        List<ApplicationModel> list = new ArrayList<ApplicationModel>();
+        if (realm.getApplications() == null)
+            return list;
+        for (ApplicationEntity entity : realm.getApplications()) {
+            list.add(new ApplicationAdapter(this, em, session, entity));
+        }
+        return list;
+    }
+
+    @Override
+    public ApplicationModel addApplication(String name) {
+        return this.addApplication(KeycloakModelUtils.generateId(), name);
+    }
+
+    @Override
+    public ApplicationModel addApplication(String id, String name) {
+        ApplicationEntity applicationData = new ApplicationEntity();
+        applicationData.setId(id);
+        applicationData.setName(name);
+        applicationData.setEnabled(true);
+        applicationData.setRealm(realm);
+        realm.getApplications().add(applicationData);
+        em.persist(applicationData);
+        em.flush();
+        final ApplicationModel resource = new ApplicationAdapter(this, em, session, applicationData);
+        em.flush();
+        session.getKeycloakSessionFactory().publish(new ApplicationCreationEvent() {
+            @Override
+            public ApplicationModel getCreatedApplication() {
+                return resource;
+            }
+
+            @Override
+            public ClientModel getCreatedClient() {
+                return resource;
+            }
+        });
+        return resource;
+    }
+
+    @Override
+    public boolean removeApplication(String id) {
+        if (id == null)
+            return false;
+        ApplicationModel application = getApplicationById(id);
+        if (application == null)
+            return false;
+
+        for (RoleModel role : application.getRoles()) {
+            application.removeRole(role);
+        }
+
+        ApplicationEntity applicationEntity = null;
+        Iterator<ApplicationEntity> it = realm.getApplications().iterator();
+        while (it.hasNext()) {
+            ApplicationEntity ae = it.next();
+            if (ae.getId().equals(id)) {
+                applicationEntity = ae;
+                it.remove();
+                break;
+            }
+        }
+        for (ApplicationEntity a : realm.getApplications()) {
+            if (a.getId().equals(id)) {
+                applicationEntity = a;
+            }
+        }
+        if (application == null) {
+            return false;
+        }
+        em.remove(applicationEntity);
+        em.createNamedQuery("deleteScopeMappingByClient").setParameter("client", applicationEntity).executeUpdate();
+        em.flush();
+
+        return true;
+    }
+
+    @Override
+    public ApplicationModel getApplicationById(String id) {
+        return session.realms().getApplicationById(id, this);
+    }
+
+    @Override
+    public ApplicationModel getApplicationByName(String name) {
+        return getApplicationNameMap().get(name);
+    }
+
+    @Override
+    public OAuthClientModel addOAuthClient(String name) {
+        return this.addOAuthClient(KeycloakModelUtils.generateId(), name);
+    }
+
+    @Override
+    public OAuthClientModel addOAuthClient(String id, String name) {
+        OAuthClientEntity data = new OAuthClientEntity();
+        data.setId(id);
+        data.setEnabled(true);
+        data.setName(name);
+        data.setRealm(realm);
+        em.persist(data);
+        em.flush();
+        final OAuthClientModel model = new OAuthClientAdapter(this, data, em);
+        em.flush();
+        session.getKeycloakSessionFactory().publish(new OAuthClientCreationEvent() {
+            @Override
+            public OAuthClientModel getCreatedOAuthClient() {
+                return model;
+            }
+
+            @Override
+            public ClientModel getCreatedClient() {
+                return model;
+            }
+        });
+        return model;
+    }
+
+    @Override
+    public boolean removeOAuthClient(String id) {
+        OAuthClientModel oauth = getOAuthClientById(id);
+        if (oauth == null)
+            return false;
+        OAuthClientEntity client = em.getReference(OAuthClientEntity.class, oauth.getId());
+        em.createNamedQuery("deleteScopeMappingByClient").setParameter("client", client).executeUpdate();
+        em.remove(client);
+        return true;
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClient(String name) {
+        TypedQuery<OAuthClientEntity> query = em.createNamedQuery("findOAuthClientByName", OAuthClientEntity.class);
+        query.setParameter("name", name);
+        query.setParameter("realm", realm);
+        List<OAuthClientEntity> entities = query.getResultList();
+        if (entities.size() == 0)
+            return null;
+        return new OAuthClientAdapter(this, entities.get(0), em);
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClientById(String id) {
+        return session.realms().getOAuthClientById(id, this);
+    }
+
+    @Override
+    public List<OAuthClientModel> getOAuthClients() {
+        TypedQuery<OAuthClientEntity> query = em.createNamedQuery("findOAuthClientByRealm", OAuthClientEntity.class);
+        query.setParameter("realm", realm);
+        List<OAuthClientEntity> entities = query.getResultList();
+        List<OAuthClientModel> list = new ArrayList<OAuthClientModel>();
+        for (OAuthClientEntity entity : entities)
+            list.add(new OAuthClientAdapter(this, entity, em));
+        return list;
+    }
+
+    private static final String BROWSER_HEADER_PREFIX = "_browser_header.";
+
+    @Override
+    public Map<String, String> getBrowserSecurityHeaders() {
+        Map<String, String> attributes = getAttributes();
+        Map<String, String> headers = new HashMap<String, String>();
+        for (Map.Entry<String, String> entry : attributes.entrySet()) {
+            if (entry.getKey().startsWith(BROWSER_HEADER_PREFIX)) {
+                headers.put(entry.getKey().substring(BROWSER_HEADER_PREFIX.length()), entry.getValue());
+            }
+        }
+        return headers;
+    }
+
+    @Override
+    public void setBrowserSecurityHeaders(Map<String, String> headers) {
+        for (Map.Entry<String, String> entry : headers.entrySet()) {
+            setAttribute(BROWSER_HEADER_PREFIX + entry.getKey(), entry.getValue());
+        }
+    }
+
+    @Override
+    public Map<String, String> getSmtpConfig() {
+        return realm.getSmtpConfig();
+    }
+
+    @Override
+    public void setSmtpConfig(Map<String, String> smtpConfig) {
+        realm.setSmtpConfig(smtpConfig);
+        em.flush();
+    }
+
+    @Override
+    public List<UserFederationProviderModel> getUserFederationProviders() {
+        List<UserFederationProviderEntity> entities = realm.getUserFederationProviders();
+        List<UserFederationProviderEntity> copy = new ArrayList<UserFederationProviderEntity>();
+        for (UserFederationProviderEntity entity : entities) {
+            copy.add(entity);
+
+        }
+        Collections.sort(copy, new Comparator<UserFederationProviderEntity>() {
+
+            @Override
+            public int compare(UserFederationProviderEntity o1, UserFederationProviderEntity o2) {
+                return o1.getPriority() - o2.getPriority();
+            }
+
+        });
+        List<UserFederationProviderModel> result = new ArrayList<UserFederationProviderModel>();
+        for (UserFederationProviderEntity entity : copy) {
+            result.add(new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
+                    .getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(), entity
+                    .getLastSync()));
+        }
+
+        return result;
+    }
+
+    @Override
+    public UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config,
+            int priority, String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync) {
+        String id = KeycloakModelUtils.generateId();
+        UserFederationProviderEntity entity = new UserFederationProviderEntity();
+        entity.setId(id);
+        entity.setRealm(realm);
+        entity.setProviderName(providerName);
+        entity.setConfig(config);
+        entity.setPriority(priority);
+        if (displayName == null) {
+            displayName = id;
+        }
+        entity.setDisplayName(displayName);
+        entity.setFullSyncPeriod(fullSyncPeriod);
+        entity.setChangedSyncPeriod(changedSyncPeriod);
+        entity.setLastSync(lastSync);
+        em.persist(entity);
+        realm.getUserFederationProviders().add(entity);
+        em.flush();
+        return new UserFederationProviderModel(entity.getId(), providerName, config, priority, displayName, fullSyncPeriod,
+                changedSyncPeriod, lastSync);
+    }
+
+    @Override
+    public void removeUserFederationProvider(UserFederationProviderModel provider) {
+        Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
+        while (it.hasNext()) {
+            UserFederationProviderEntity entity = it.next();
+            if (entity.getId().equals(provider.getId())) {
+                session.users().preRemove(this, provider);
+                it.remove();
+                em.remove(entity);
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void updateUserFederationProvider(UserFederationProviderModel model) {
+        Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
+        while (it.hasNext()) {
+            UserFederationProviderEntity entity = it.next();
+            if (entity.getId().equals(model.getId())) {
+                String displayName = model.getDisplayName();
+                if (displayName != null) {
+                    entity.setDisplayName(model.getDisplayName());
+                }
+                entity.setConfig(model.getConfig());
+                entity.setPriority(model.getPriority());
+                entity.setProviderName(model.getProviderName());
+                entity.setPriority(model.getPriority());
+                entity.setFullSyncPeriod(model.getFullSyncPeriod());
+                entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
+                entity.setLastSync(model.getLastSync());
+                break;
+            }
+        }
+    }
+
+    @Override
+    public void setUserFederationProviders(List<UserFederationProviderModel> providers) {
+
+        Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
+        while (it.hasNext()) {
+            UserFederationProviderEntity entity = it.next();
+            boolean found = false;
+            for (UserFederationProviderModel model : providers) {
+                if (entity.getId().equals(model.getId())) {
+                    entity.setConfig(model.getConfig());
+                    entity.setPriority(model.getPriority());
+                    entity.setProviderName(model.getProviderName());
+                    entity.setPriority(model.getPriority());
+                    String displayName = model.getDisplayName();
+                    if (displayName != null) {
+                        entity.setDisplayName(model.getDisplayName());
+                    }
+                    entity.setFullSyncPeriod(model.getFullSyncPeriod());
+                    entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
+                    entity.setLastSync(model.getLastSync());
+                    found = true;
+                    break;
+                }
+
+            }
+            if (found)
+                continue;
+            session.users().preRemove(
+                    this,
+                    new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
+                            .getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(),
+                            entity.getLastSync()));
+            it.remove();
+            em.remove(entity);
+        }
+
+        List<UserFederationProviderModel> add = new LinkedList<UserFederationProviderModel>();
+        for (UserFederationProviderModel model : providers) {
+            boolean found = false;
+            for (UserFederationProviderEntity entity : realm.getUserFederationProviders()) {
+                if (entity.getId().equals(model.getId())) {
+                    found = true;
+                    break;
+                }
+            }
+            if (!found)
+                add.add(model);
+        }
+
+        for (UserFederationProviderModel model : add) {
+            UserFederationProviderEntity entity = new UserFederationProviderEntity();
+            if (model.getId() != null)
+                entity.setId(model.getId());
+            else
+                entity.setId(KeycloakModelUtils.generateId());
+            entity.setConfig(model.getConfig());
+            entity.setPriority(model.getPriority());
+            entity.setProviderName(model.getProviderName());
+            entity.setPriority(model.getPriority());
+            String displayName = model.getDisplayName();
+            if (displayName == null) {
+                displayName = entity.getId();
+            }
+            entity.setDisplayName(displayName);
+            entity.setFullSyncPeriod(model.getFullSyncPeriod());
+            entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
+            entity.setLastSync(model.getLastSync());
+            em.persist(entity);
+            realm.getUserFederationProviders().add(entity);
+
+        }
+    }
+
+    @Override
+    public RoleModel getRole(String name) {
+        TypedQuery<RoleEntity> query = em.createNamedQuery("getRealmRoleByName", RoleEntity.class);
+        query.setParameter("name", name);
+        query.setParameter("realm", realm);
+        List<RoleEntity> roles = query.getResultList();
+        if (roles.size() == 0)
+            return null;
+        return new RoleAdapter(this, em, roles.get(0));
+    }
+
+    @Override
+    public RoleModel addRole(String name) {
+        return this.addRole(KeycloakModelUtils.generateId(), name);
+    }
+
+    @Override
+    public RoleModel addRole(String id, String name) {
+        RoleEntity entity = new RoleEntity();
+        entity.setId(id);
+        entity.setName(name);
+        entity.setRealm(realm);
+        entity.setRealmId(realm.getId());
+        realm.getRoles().add(entity);
+        em.persist(entity);
+        em.flush();
+        return new RoleAdapter(this, em, entity);
+    }
+
+    @Override
+    public boolean removeRole(RoleModel role) {
+        if (role == null) {
+            return false;
+        }
+        if (!role.getContainer().equals(this))
+            return false;
+        session.users().preRemove(this, role);
+        RoleEntity roleEntity = RoleAdapter.toRoleEntity(role, em);
+        realm.getRoles().remove(role);
+        realm.getDefaultRoles().remove(role);
+
+        em.createNativeQuery("delete from COMPOSITE_ROLE where CHILD_ROLE = :role").setParameter("role", roleEntity)
+                .executeUpdate();
+        em.createNamedQuery("deleteScopeMappingByRole").setParameter("role", roleEntity).executeUpdate();
+
+        em.remove(roleEntity);
+
+        return true;
+    }
+
+    @Override
+    public Set<RoleModel> getRoles() {
+        Set<RoleModel> list = new HashSet<RoleModel>();
+        Collection<RoleEntity> roles = realm.getRoles();
+        if (roles == null)
+            return list;
+        for (RoleEntity entity : roles) {
+            list.add(new RoleAdapter(this, em, entity));
+        }
+        return list;
+    }
+
+    @Override
+    public RoleModel getRoleById(String id) {
+        return session.realms().getRoleById(id, this);
+    }
+
+    @Override
+    public boolean removeRoleById(String id) {
+        RoleModel role = getRoleById(id);
+        if (role == null)
+            return false;
+        return role.getContainer().removeRole(role);
+    }
+
+    @Override
+    public PasswordPolicy getPasswordPolicy() {
+        if (passwordPolicy == null) {
+            passwordPolicy = new PasswordPolicy(realm.getPasswordPolicy());
+        }
+        return passwordPolicy;
+    }
+
+    @Override
+    public void setPasswordPolicy(PasswordPolicy policy) {
+        this.passwordPolicy = policy;
+        realm.setPasswordPolicy(policy.toString());
+        em.flush();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || !(o instanceof RealmModel))
+            return false;
+
+        RealmModel that = (RealmModel) o;
+        return that.getId().equals(getId());
+    }
+
+    @Override
+    public int hashCode() {
+        return getId().hashCode();
+    }
+
+    @Override
+    public String getLoginTheme() {
+        return realm.getLoginTheme();
+    }
+
+    @Override
+    public void setLoginTheme(String name) {
+        realm.setLoginTheme(name);
+        em.flush();
+    }
+
+    @Override
+    public String getAccountTheme() {
+        return realm.getAccountTheme();
+    }
+
+    @Override
+    public void setAccountTheme(String name) {
+        realm.setAccountTheme(name);
+        em.flush();
+    }
+
+    @Override
+    public String getAdminTheme() {
+        return realm.getAdminTheme();
+    }
+
+    @Override
+    public void setAdminTheme(String name) {
+        realm.setAdminTheme(name);
+        em.flush();
+    }
+
+    @Override
+    public String getEmailTheme() {
+        return realm.getEmailTheme();
+    }
+
+    @Override
+    public void setEmailTheme(String name) {
+        realm.setEmailTheme(name);
+        em.flush();
+    }
+
+    @Override
+    public boolean isEventsEnabled() {
+        return realm.isEventsEnabled();
+    }
+
+    @Override
+    public void setEventsEnabled(boolean enabled) {
+        realm.setEventsEnabled(enabled);
+        em.flush();
+    }
+
+    @Override
+    public long getEventsExpiration() {
+        return realm.getEventsExpiration();
+    }
+
+    @Override
+    public void setEventsExpiration(long expiration) {
+        realm.setEventsExpiration(expiration);
+        em.flush();
+    }
+
+    @Override
+    public Set<String> getEventsListeners() {
+        return realm.getEventsListeners();
+    }
+
+    @Override
+    public void setEventsListeners(Set<String> listeners) {
+        realm.setEventsListeners(listeners);
+        em.flush();
+    }
+
+    @Override
+    public ApplicationModel getMasterAdminApp() {
+        return new ApplicationAdapter(this, em, session, realm.getMasterAdminApp());
+    }
+
+    @Override
+    public void setMasterAdminApp(ApplicationModel app) {
+        ApplicationEntity appEntity = app != null ? em.getReference(ApplicationEntity.class, app.getId()) : null;
+        realm.setMasterAdminApp(appEntity);
+        em.flush();
+    }
+
+    @Override
+    public List<IdentityProviderModel> getIdentityProviders() {
+        List<IdentityProviderModel> identityProviders = new ArrayList<IdentityProviderModel>();
+
+        for (IdentityProviderEntity entity : realm.getIdentityProviders()) {
+            IdentityProviderModel identityProviderModel = new IdentityProviderModel();
+
+            identityProviderModel.setProviderId(entity.getProviderId());
+            identityProviderModel.setId(entity.getId());
+            identityProviderModel.setInternalId(entity.getInternalId());
+            identityProviderModel.setName(entity.getName());
+            identityProviderModel.setConfig(entity.getConfig());
+            identityProviderModel.setEnabled(entity.isEnabled());
+            identityProviderModel.setUpdateProfileFirstLogin(entity.isUpdateProfileFirstLogin());
+            identityProviderModel.setAuthenticateByDefault(entity.isAuthenticateByDefault());
+            identityProviderModel.setStoreToken(entity.isStoreToken());
+
+            identityProviders.add(identityProviderModel);
+        }
+
+        return identityProviders;
+    }
+
+    @Override
+    public IdentityProviderModel getIdentityProviderById(String identityProviderId) {
+        for (IdentityProviderModel identityProviderModel : getIdentityProviders()) {
+            if (identityProviderModel.getId().equals(identityProviderId)) {
+                return identityProviderModel;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public void addIdentityProvider(IdentityProviderModel identityProvider) {
+        IdentityProviderEntity entity = new IdentityProviderEntity();
+
+        entity.setInternalId(KeycloakModelUtils.generateId());
+        entity.setId(identityProvider.getId());
+        entity.setProviderId(identityProvider.getProviderId());
+        entity.setName(identityProvider.getName());
+        entity.setEnabled(identityProvider.isEnabled());
+        entity.setStoreToken(identityProvider.isStoreToken());
+        entity.setUpdateProfileFirstLogin(identityProvider.isUpdateProfileFirstLogin());
+        entity.setAuthenticateByDefault(identityProvider.isAuthenticateByDefault());
+        entity.setConfig(identityProvider.getConfig());
+
+        realm.addIdentityProvider(entity);
+
+        em.persist(entity);
+        em.flush();
+    }
+
+    @Override
+    public void removeIdentityProviderById(String providerId) {
+        for (IdentityProviderEntity entity : realm.getIdentityProviders()) {
+            if (entity.getId().equals(providerId)) {
+                em.remove(entity);
+                em.flush();
+            }
+        }
+    }
+
+    @Override
+    public void updateIdentityProvider(IdentityProviderModel identityProvider) {
+        for (IdentityProviderEntity entity : this.realm.getIdentityProviders()) {
+            if (entity.getInternalId().equals(identityProvider.getInternalId())) {
+                entity.setId(identityProvider.getId());
+                entity.setName(identityProvider.getName());
+                entity.setEnabled(identityProvider.isEnabled());
+                entity.setUpdateProfileFirstLogin(identityProvider.isUpdateProfileFirstLogin());
+                entity.setAuthenticateByDefault(identityProvider.isAuthenticateByDefault());
+                entity.setStoreToken(identityProvider.isStoreToken());
+                entity.setConfig(identityProvider.getConfig());
+            }
+        }
+
+        em.flush();
+    }
+
+    @Override
+    public boolean isIdentityFederationEnabled() {
+        return !this.realm.getIdentityProviders().isEmpty();
+    }
 
 }
\ No newline at end of file
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 4543afa..6efa261 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
@@ -46,1047 +46,1047 @@ import com.mongodb.QueryBuilder;
  */
 public class RealmAdapter extends AbstractMongoAdapter<MongoRealmEntity> implements RealmModel {
 
-	private final MongoRealmEntity realm;
-	private final RealmProvider model;
-
-	protected volatile transient PublicKey publicKey;
-	protected volatile transient PrivateKey privateKey;
-	protected volatile transient X509Certificate certificate;
-	protected volatile transient Key codeSecretKey;
-
-	private volatile transient PasswordPolicy passwordPolicy;
-	private volatile transient KeycloakSession session;
-
-	public RealmAdapter(KeycloakSession session, MongoRealmEntity realmEntity,
-			MongoStoreInvocationContext invocationContext) {
-		super(invocationContext);
-		this.realm = realmEntity;
-		this.session = session;
-		this.model = session.realms();
-	}
-
-	@Override
-	public String getId() {
-		return realm.getId();
-	}
-
-	@Override
-	public String getName() {
-		return realm.getName();
-	}
-
-	@Override
-	public void setName(String name) {
-		realm.setName(name);
-		updateRealm();
-	}
-
-	@Override
-	public boolean isEnabled() {
-		return realm.isEnabled();
-	}
-
-	@Override
-	public void setEnabled(boolean enabled) {
-		realm.setEnabled(enabled);
-		updateRealm();
-	}
-
-	@Override
-	public SslRequired getSslRequired() {
-		return SslRequired.valueOf(realm.getSslRequired());
-	}
-
-	@Override
-	public void setSslRequired(SslRequired sslRequired) {
-		realm.setSslRequired(sslRequired.name());
-		updateRealm();
-	}
-
-	@Override
-	public boolean isPasswordCredentialGrantAllowed() {
-		return realm.isPasswordCredentialGrantAllowed();
-	}
-
-	@Override
-	public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
-		realm.setPasswordCredentialGrantAllowed(passwordCredentialGrantAllowed);
-		updateRealm();
-	}
-
-	@Override
-	public boolean isRegistrationAllowed() {
-		return realm.isRegistrationAllowed();
-	}
-
-	@Override
-	public void setRegistrationAllowed(boolean registrationAllowed) {
-		realm.setRegistrationAllowed(registrationAllowed);
-		updateRealm();
-	}
-
-	public boolean isRegistrationEmailAsUsername() {
-		return realm.isRegistrationEmailAsUsername();
-	}
-
-	public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
-		realm.setRegistrationEmailAsUsername(registrationEmailAsUsername);
-		updateRealm();
-	}
-
-	@Override
-	public boolean isRememberMe() {
-		return realm.isRememberMe();
-	}
-
-	@Override
-	public void setRememberMe(boolean rememberMe) {
-		realm.setRememberMe(rememberMe);
-		updateRealm();
-	}
-
-	@Override
-	public boolean isBruteForceProtected() {
-		return realm.isBruteForceProtected();
-	}
-
-	@Override
-	public void setBruteForceProtected(boolean value) {
-		realm.setBruteForceProtected(value);
-		updateRealm();
-	}
-
-	@Override
-	public int getMaxFailureWaitSeconds() {
-		return realm.getMaxFailureWaitSeconds();
-	}
-
-	@Override
-	public void setMaxFailureWaitSeconds(int val) {
-		realm.setMaxFailureWaitSeconds(val);
-		updateRealm();
-	}
-
-	@Override
-	public int getWaitIncrementSeconds() {
-		return realm.getWaitIncrementSeconds();
-	}
-
-	@Override
-	public void setWaitIncrementSeconds(int val) {
-		realm.setWaitIncrementSeconds(val);
-		updateRealm();
-	}
-
-	@Override
-	public long getQuickLoginCheckMilliSeconds() {
-		return realm.getQuickLoginCheckMilliSeconds();
-	}
-
-	@Override
-	public void setQuickLoginCheckMilliSeconds(long val) {
-		realm.setQuickLoginCheckMilliSeconds(val);
-		updateRealm();
-	}
-
-	@Override
-	public int getMinimumQuickLoginWaitSeconds() {
-		return realm.getMinimumQuickLoginWaitSeconds();
-	}
-
-	@Override
-	public void setMinimumQuickLoginWaitSeconds(int val) {
-		realm.setMinimumQuickLoginWaitSeconds(val);
-		updateRealm();
-	}
-
-	@Override
-	public int getMaxDeltaTimeSeconds() {
-		return realm.getMaxDeltaTimeSeconds();
-	}
-
-	@Override
-	public void setMaxDeltaTimeSeconds(int val) {
-		realm.setMaxDeltaTimeSeconds(val);
-		updateRealm();
-	}
-
-	@Override
-	public int getFailureFactor() {
-		return realm.getFailureFactor();
-	}
-
-	@Override
-	public void setFailureFactor(int failureFactor) {
-		realm.setFailureFactor(failureFactor);
-		updateRealm();
-	}
-
-	@Override
-	public boolean isVerifyEmail() {
-		return realm.isVerifyEmail();
-	}
-
-	@Override
-	public void setVerifyEmail(boolean verifyEmail) {
-		realm.setVerifyEmail(verifyEmail);
-		updateRealm();
-	}
-
-	@Override
-	public boolean isResetPasswordAllowed() {
-		return realm.isResetPasswordAllowed();
-	}
-
-	@Override
-	public void setResetPasswordAllowed(boolean resetPassword) {
-		realm.setResetPasswordAllowed(resetPassword);
-		updateRealm();
-	}
-
-	@Override
-	public PasswordPolicy getPasswordPolicy() {
-		if (passwordPolicy == null) {
-			passwordPolicy = new PasswordPolicy(realm.getPasswordPolicy());
-		}
-		return passwordPolicy;
-	}
-
-	@Override
-	public void setPasswordPolicy(PasswordPolicy policy) {
-		this.passwordPolicy = policy;
-		realm.setPasswordPolicy(policy.toString());
-		updateRealm();
-	}
-
-	@Override
-	public int getNotBefore() {
-		return realm.getNotBefore();
-	}
-
-	@Override
-	public void setNotBefore(int notBefore) {
-		realm.setNotBefore(notBefore);
-		updateRealm();
-	}
-
-	@Override
-	public int getSsoSessionIdleTimeout() {
-		return realm.getSsoSessionIdleTimeout();
-	}
-
-	@Override
-	public void setSsoSessionIdleTimeout(int seconds) {
-		realm.setSsoSessionIdleTimeout(seconds);
-		updateRealm();
-	}
-
-	@Override
-	public int getSsoSessionMaxLifespan() {
-		return realm.getSsoSessionMaxLifespan();
-	}
-
-	@Override
-	public void setSsoSessionMaxLifespan(int seconds) {
-		realm.setSsoSessionMaxLifespan(seconds);
-		updateRealm();
-	}
-
-	@Override
-	public int getAccessTokenLifespan() {
-		return realm.getAccessTokenLifespan();
-	}
-
-	@Override
-	public void setAccessTokenLifespan(int tokenLifespan) {
-		realm.setAccessTokenLifespan(tokenLifespan);
-		updateRealm();
-	}
-
-	@Override
-	public int getAccessCodeLifespan() {
-		return realm.getAccessCodeLifespan();
-	}
-
-	@Override
-	public void setAccessCodeLifespan(int accessCodeLifespan) {
-		realm.setAccessCodeLifespan(accessCodeLifespan);
-		updateRealm();
-	}
-
-	@Override
-	public int getAccessCodeLifespanUserAction() {
-		return realm.getAccessCodeLifespanUserAction();
-	}
-
-	@Override
-	public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
-		realm.setAccessCodeLifespanUserAction(accessCodeLifespanUserAction);
-		updateRealm();
-	}
-
-	@Override
-	public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
-		realm.setAccessCodeLifespanLogin(accessCodeLifespanLogin);
-		updateRealm();
-	}
-
-	@Override
-	public int getAccessCodeLifespanLogin() {
-		return realm.getAccessCodeLifespanLogin();
-	}
-
-	@Override
-	public String getPublicKeyPem() {
-		return realm.getPublicKeyPem();
-	}
-
-	@Override
-	public void setPublicKeyPem(String publicKeyPem) {
-		realm.setPublicKeyPem(publicKeyPem);
-		this.publicKey = null;
-		updateRealm();
-	}
-
-	@Override
-	public X509Certificate getCertificate() {
-		if (certificate != null)
-			return certificate;
-		certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
-		return certificate;
-	}
-
-	@Override
-	public void setCertificate(X509Certificate certificate) {
-		this.certificate = certificate;
-		String certificatePem = KeycloakModelUtils.getPemFromCertificate(certificate);
-		setCertificatePem(certificatePem);
-
-	}
-
-	@Override
-	public String getCertificatePem() {
-		return realm.getCertificatePem();
-	}
-
-	@Override
-	public void setCertificatePem(String certificate) {
-		realm.setCertificatePem(certificate);
-
-	}
-
-	@Override
-	public String getPrivateKeyPem() {
-		return realm.getPrivateKeyPem();
-	}
-
-	@Override
-	public void setPrivateKeyPem(String privateKeyPem) {
-		realm.setPrivateKeyPem(privateKeyPem);
-		this.privateKey = null;
-		updateRealm();
-	}
-
-	@Override
-	public PublicKey getPublicKey() {
-		if (publicKey != null)
-			return publicKey;
-		publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
-		return publicKey;
-	}
-
-	@Override
-	public void setPublicKey(PublicKey publicKey) {
-		this.publicKey = publicKey;
-		String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
-		setPublicKeyPem(publicKeyPem);
-	}
-
-	@Override
-	public PrivateKey getPrivateKey() {
-		if (privateKey != null)
-			return privateKey;
-		privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
-		return privateKey;
-	}
-
-	@Override
-	public void setPrivateKey(PrivateKey privateKey) {
-		this.privateKey = privateKey;
-		String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
-		setPrivateKeyPem(privateKeyPem);
-	}
-
-	@Override
-	public String getCodeSecret() {
-		return realm.getCodeSecret();
-	}
-
-	@Override
-	public Key getCodeSecretKey() {
-		if (codeSecretKey == null) {
-			codeSecretKey = KeycloakModelUtils.getSecretKey(getCodeSecret());
-		}
-		return codeSecretKey;
-	}
-
-	@Override
-	public void setCodeSecret(String codeSecret) {
-		realm.setCodeSecret(codeSecret);
-		updateRealm();
-	}
-
-	@Override
-	public String getLoginTheme() {
-		return realm.getLoginTheme();
-	}
-
-	@Override
-	public void setLoginTheme(String name) {
-		realm.setLoginTheme(name);
-		updateRealm();
-	}
-
-	@Override
-	public String getAccountTheme() {
-		return realm.getAccountTheme();
-	}
-
-	@Override
-	public void setAccountTheme(String name) {
-		realm.setAccountTheme(name);
-		updateRealm();
-	}
-
-	@Override
-	public String getAdminTheme() {
-		return realm.getAdminTheme();
-	}
-
-	@Override
-	public void setAdminTheme(String name) {
-		realm.setAdminTheme(name);
-		updateRealm();
-	}
-
-	@Override
-	public String getEmailTheme() {
-		return realm.getEmailTheme();
-	}
-
-	@Override
-	public void setEmailTheme(String name) {
-		realm.setEmailTheme(name);
-		updateRealm();
-	}
-
-	@Override
-	public RoleAdapter getRole(String name) {
-		DBObject query = new QueryBuilder().and("name").is(name).and("realmId").is(getId()).get();
-		MongoRoleEntity role = getMongoStore().loadSingleEntity(MongoRoleEntity.class, query, invocationContext);
-		if (role == null) {
-			return null;
-		} else {
-			return new RoleAdapter(session, this, role, this, invocationContext);
-		}
-	}
-
-	@Override
-	public RoleModel addRole(String name) {
-		return this.addRole(null, name);
-	}
-
-	@Override
-	public RoleModel addRole(String id, String name) {
-		MongoRoleEntity roleEntity = new MongoRoleEntity();
-		roleEntity.setId(id);
-		roleEntity.setName(name);
-		roleEntity.setRealmId(getId());
-
-		getMongoStore().insertEntity(roleEntity, invocationContext);
-
-		return new RoleAdapter(session, this, roleEntity, this, invocationContext);
-	}
-
-	@Override
-	public boolean removeRole(RoleModel role) {
-		return removeRoleById(role.getId());
-	}
-
-	@Override
-	public boolean removeRoleById(String id) {
-		RoleModel role = getRoleById(id);
-		if (role == null)
-			return false;
-		session.users().preRemove(this, role);
-		return getMongoStore().removeEntity(MongoRoleEntity.class, id, invocationContext);
-	}
-
-	@Override
-	public Set<RoleModel> getRoles() {
-		DBObject query = new QueryBuilder().and("realmId").is(getId()).get();
-		List<MongoRoleEntity> roles = getMongoStore().loadEntities(MongoRoleEntity.class, query, invocationContext);
-
-		Set<RoleModel> result = new HashSet<RoleModel>();
-
-		if (roles == null)
-			return result;
-		for (MongoRoleEntity role : roles) {
-			result.add(new RoleAdapter(session, this, role, this, invocationContext));
-		}
-
-		return result;
-	}
-
-	@Override
-	public RoleModel getRoleById(String id) {
-		return model.getRoleById(id, this);
-	}
-
-	@Override
-	public List<String> getDefaultRoles() {
-		return realm.getDefaultRoles();
-	}
-
-	@Override
-	public void addDefaultRole(String name) {
-		RoleModel role = getRole(name);
-		if (role == null) {
-			addRole(name);
-		}
-
-		getMongoStore().pushItemToList(realm, "defaultRoles", name, true, invocationContext);
-	}
-
-	@Override
-	public void updateDefaultRoles(String[] defaultRoles) {
-		List<String> roleNames = new ArrayList<String>();
-		for (String roleName : defaultRoles) {
-			RoleModel role = getRole(roleName);
-			if (role == null) {
-				addRole(roleName);
-			}
-
-			roleNames.add(roleName);
-		}
-
-		realm.setDefaultRoles(roleNames);
-		updateRealm();
-	}
-
-	@Override
-	public ClientModel findClient(String clientId) {
-		ClientModel model = getApplicationByName(clientId);
-		if (model != null)
-			return model;
-		return getOAuthClient(clientId);
-	}
-
-	@Override
-	public ClientModel findClientById(String id) {
-		ClientModel model = getApplicationById(id);
-		if (model != null)
-			return model;
-		return getOAuthClientById(id);
-	}
-
-	@Override
-	public ApplicationModel getApplicationById(String id) {
-		return model.getApplicationById(id, this);
-	}
-
-	@Override
-	public ApplicationModel getApplicationByName(String name) {
-		DBObject query = new QueryBuilder().and("realmId").is(getId()).and("name").is(name).get();
-		MongoApplicationEntity appEntity = getMongoStore().loadSingleEntity(MongoApplicationEntity.class, query,
-				invocationContext);
-		return appEntity == null ? null : new ApplicationAdapter(session, this, appEntity, invocationContext);
-	}
-
-	@Override
-	public Map<String, ApplicationModel> getApplicationNameMap() {
-		Map<String, ApplicationModel> resourceMap = new HashMap<String, ApplicationModel>();
-		for (ApplicationModel resource : getApplications()) {
-			resourceMap.put(resource.getName(), resource);
-		}
-		return resourceMap;
-	}
-
-	@Override
-	public List<ApplicationModel> getApplications() {
-		DBObject query = new QueryBuilder().and("realmId").is(getId()).get();
-		List<MongoApplicationEntity> appDatas = getMongoStore().loadEntities(MongoApplicationEntity.class, query,
-				invocationContext);
-
-		List<ApplicationModel> result = new ArrayList<ApplicationModel>();
-		for (MongoApplicationEntity appData : appDatas) {
-			result.add(new ApplicationAdapter(session, this, appData, invocationContext));
-		}
-		return result;
-	}
-
-	@Override
-	public ApplicationModel addApplication(String name) {
-		return this.addApplication(null, name);
-	}
-
-	@Override
-	public ApplicationModel addApplication(String id, String name) {
-		MongoApplicationEntity appData = new MongoApplicationEntity();
-		appData.setId(id);
-		appData.setName(name);
-		appData.setRealmId(getId());
-		appData.setEnabled(true);
-		getMongoStore().insertEntity(appData, invocationContext);
-
-		final ApplicationModel model = new ApplicationAdapter(session, this, appData, invocationContext);
-		session.getKeycloakSessionFactory().publish(new ApplicationCreationEvent() {
-			@Override
-			public ApplicationModel getCreatedApplication() {
-				return model;
-			}
-
-			@Override
-			public ClientModel getCreatedClient() {
-				return model;
-			}
-		});
-		return model;
-	}
-
-	@Override
-	public boolean removeApplication(String id) {
-		return getMongoStore().removeEntity(MongoApplicationEntity.class, id, invocationContext);
-	}
-
-	@Override
-	public OAuthClientModel addOAuthClient(String name) {
-		return this.addOAuthClient(null, name);
-	}
-
-	@Override
-	public OAuthClientModel addOAuthClient(String id, String name) {
-		MongoOAuthClientEntity oauthClient = new MongoOAuthClientEntity();
-		oauthClient.setId(id);
-		oauthClient.setRealmId(getId());
-		oauthClient.setName(name);
-		getMongoStore().insertEntity(oauthClient, invocationContext);
-
-		final OAuthClientAdapter model = new OAuthClientAdapter(session, this, oauthClient, invocationContext);
-		session.getKeycloakSessionFactory().publish(new OAuthClientCreationEvent() {
-			@Override
-			public OAuthClientModel getCreatedOAuthClient() {
-				return model;
-			}
-
-			@Override
-			public ClientModel getCreatedClient() {
-				return model;
-			}
-		});
-		return model;
-	}
-
-	@Override
-	public boolean removeOAuthClient(String id) {
-		return getMongoStore().removeEntity(MongoOAuthClientEntity.class, id, invocationContext);
-	}
-
-	@Override
-	public OAuthClientModel getOAuthClient(String name) {
-		DBObject query = new QueryBuilder().and("realmId").is(getId()).and("name").is(name).get();
-		MongoOAuthClientEntity oauthClient = getMongoStore().loadSingleEntity(MongoOAuthClientEntity.class, query,
-				invocationContext);
-		return oauthClient == null ? null : new OAuthClientAdapter(session, this, oauthClient, invocationContext);
-	}
-
-	@Override
-	public OAuthClientModel getOAuthClientById(String id) {
-		return model.getOAuthClientById(id, this);
-	}
-
-	@Override
-	public List<OAuthClientModel> getOAuthClients() {
-		DBObject query = new QueryBuilder().and("realmId").is(getId()).get();
-		List<MongoOAuthClientEntity> results = getMongoStore().loadEntities(MongoOAuthClientEntity.class, query,
-				invocationContext);
-		List<OAuthClientModel> list = new ArrayList<OAuthClientModel>();
-		for (MongoOAuthClientEntity data : results) {
-			list.add(new OAuthClientAdapter(session, this, data, invocationContext));
-		}
-		return list;
-	}
-
-	@Override
-	public void addRequiredCredential(String type) {
-		RequiredCredentialModel credentialModel = initRequiredCredentialModel(type);
-		addRequiredCredential(credentialModel, realm.getRequiredCredentials());
-	}
-
-	protected void addRequiredCredential(RequiredCredentialModel credentialModel,
-			List<RequiredCredentialEntity> persistentCollection) {
-		RequiredCredentialEntity credEntity = new RequiredCredentialEntity();
-		credEntity.setType(credentialModel.getType());
-		credEntity.setFormLabel(credentialModel.getFormLabel());
-		credEntity.setInput(credentialModel.isInput());
-		credEntity.setSecret(credentialModel.isSecret());
-
-		persistentCollection.add(credEntity);
-
-		updateRealm();
-	}
-
-	@Override
-	public void updateRequiredCredentials(Set<String> creds) {
-		updateRequiredCredentials(creds, realm.getRequiredCredentials());
-	}
-
-	protected void updateRequiredCredentials(Set<String> creds, List<RequiredCredentialEntity> credsEntities) {
-		Set<String> already = new HashSet<String>();
-		Set<RequiredCredentialEntity> toRemove = new HashSet<RequiredCredentialEntity>();
-		for (RequiredCredentialEntity entity : credsEntities) {
-			if (!creds.contains(entity.getType())) {
-				toRemove.add(entity);
-			} else {
-				already.add(entity.getType());
-			}
-		}
-		for (RequiredCredentialEntity entity : toRemove) {
-			credsEntities.remove(entity);
-		}
-		for (String cred : creds) {
-			if (!already.contains(cred)) {
-				RequiredCredentialModel credentialModel = initRequiredCredentialModel(cred);
-				addRequiredCredential(credentialModel, credsEntities);
-			}
-		}
-		updateRealm();
-	}
-
-	@Override
-	public List<RequiredCredentialModel> getRequiredCredentials() {
-		return convertRequiredCredentialEntities(realm.getRequiredCredentials());
-	}
-
-	protected List<RequiredCredentialModel> convertRequiredCredentialEntities(
-			Collection<RequiredCredentialEntity> credEntities) {
-
-		List<RequiredCredentialModel> result = new ArrayList<RequiredCredentialModel>();
-		for (RequiredCredentialEntity entity : credEntities) {
-			RequiredCredentialModel model = new RequiredCredentialModel();
-			model.setFormLabel(entity.getFormLabel());
-			model.setInput(entity.isInput());
-			model.setSecret(entity.isSecret());
-			model.setType(entity.getType());
-
-			result.add(model);
-		}
-		return result;
-	}
-
-	protected void updateRealm() {
-		super.updateMongoEntity();
-	}
-
-	protected RequiredCredentialModel initRequiredCredentialModel(String type) {
-		RequiredCredentialModel model = RequiredCredentialModel.BUILT_IN.get(type);
-		if (model == null) {
-			throw new RuntimeException("Unknown credential type " + type);
-		}
-		return model;
-	}
-
-	@Override
-	public Map<String, String> getBrowserSecurityHeaders() {
-		return realm.getBrowserSecurityHeaders();
-	}
-
-	@Override
-	public void setBrowserSecurityHeaders(Map<String, String> headers) {
-		realm.setBrowserSecurityHeaders(headers);
-		updateRealm();
-	}
-
-	@Override
-	public Map<String, String> getSmtpConfig() {
-		return realm.getSmtpConfig();
-	}
-
-	@Override
-	public void setSmtpConfig(Map<String, String> smtpConfig) {
-		realm.setSmtpConfig(smtpConfig);
-		updateRealm();
-	}
-
-	@Override
-	public List<IdentityProviderModel> getIdentityProviders() {
-		List<IdentityProviderModel> identityProviders = new ArrayList<IdentityProviderModel>();
-
-		for (IdentityProviderEntity entity : realm.getIdentityProviders()) {
-			IdentityProviderModel identityProviderModel = new IdentityProviderModel();
-
-			identityProviderModel.setProviderId(entity.getProviderId());
-			identityProviderModel.setId(entity.getId());
-			identityProviderModel.setInternalId(entity.getInternalId());
-			identityProviderModel.setName(entity.getName());
-			identityProviderModel.setConfig(entity.getConfig());
-			identityProviderModel.setEnabled(entity.isEnabled());
-			identityProviderModel.setUpdateProfileFirstLogin(entity.isUpdateProfileFirstLogin());
-			identityProviderModel.setAuthenticateByDefault(entity.isAuthenticateByDefault());
-			identityProviderModel.setStoreToken(entity.isStoreToken());
-
-			identityProviders.add(identityProviderModel);
-		}
-
-		return identityProviders;
-	}
-
-	@Override
-	public IdentityProviderModel getIdentityProviderById(String identityProviderId) {
-		for (IdentityProviderModel identityProviderModel : getIdentityProviders()) {
-			if (identityProviderModel.getId().equals(identityProviderId)) {
-				return identityProviderModel;
-			}
-		}
-
-		return null;
-	}
-
-	@Override
-	public void addIdentityProvider(IdentityProviderModel identityProvider) {
-		IdentityProviderEntity entity = new IdentityProviderEntity();
-
-		entity.setInternalId(KeycloakModelUtils.generateId());
-		entity.setId(identityProvider.getId());
-		entity.setProviderId(identityProvider.getProviderId());
-		entity.setName(identityProvider.getName());
-		entity.setEnabled(identityProvider.isEnabled());
-		entity.setUpdateProfileFirstLogin(identityProvider.isUpdateProfileFirstLogin());
-		entity.setStoreToken(identityProvider.isStoreToken());
-		entity.setAuthenticateByDefault(identityProvider.isAuthenticateByDefault());
-		entity.setConfig(identityProvider.getConfig());
-
-		realm.getIdentityProviders().add(entity);
-		updateRealm();
-	}
-
-	@Override
-	public void removeIdentityProviderById(String providerId) {
-		IdentityProviderEntity toRemove;
-		for (IdentityProviderEntity entity : realm.getIdentityProviders()) {
-			if (entity.getId().equals(providerId)) {
-				realm.getIdentityProviders().remove(entity);
-				updateRealm();
-				break;
-			}
-		}
-	}
-
-	@Override
-	public void updateIdentityProvider(IdentityProviderModel identityProvider) {
-		for (IdentityProviderEntity entity : this.realm.getIdentityProviders()) {
-			if (entity.getInternalId().equals(identityProvider.getInternalId())) {
-				entity.setId(identityProvider.getId());
-				entity.setName(identityProvider.getName());
-				entity.setEnabled(identityProvider.isEnabled());
-				entity.setUpdateProfileFirstLogin(identityProvider.isUpdateProfileFirstLogin());
-				entity.setAuthenticateByDefault(identityProvider.isAuthenticateByDefault());
-				entity.setStoreToken(identityProvider.isStoreToken());
-				entity.setConfig(identityProvider.getConfig());
-			}
-		}
-
-		updateRealm();
-	}
-
-	@Override
-	public UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config,
-			int priority, String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync) {
-		UserFederationProviderEntity entity = new UserFederationProviderEntity();
-		entity.setId(KeycloakModelUtils.generateId());
-		entity.setPriority(priority);
-		entity.setProviderName(providerName);
-		entity.setConfig(config);
-		if (displayName == null) {
-			displayName = entity.getId();
-		}
-		entity.setDisplayName(displayName);
-		entity.setFullSyncPeriod(fullSyncPeriod);
-		entity.setChangedSyncPeriod(changedSyncPeriod);
-		entity.setLastSync(lastSync);
-		realm.getUserFederationProviders().add(entity);
-		updateRealm();
-
-		return new UserFederationProviderModel(entity.getId(), providerName, config, priority, displayName, fullSyncPeriod,
-				changedSyncPeriod, lastSync);
-	}
-
-	@Override
-	public void removeUserFederationProvider(UserFederationProviderModel provider) {
-		Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
-		while (it.hasNext()) {
-			UserFederationProviderEntity entity = it.next();
-			if (entity.getId().equals(provider.getId())) {
-				session.users().preRemove(
-						this,
-						new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
-								.getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(),
-								entity.getLastSync()));
-				it.remove();
-			}
-		}
-		updateRealm();
-	}
-
-	@Override
-	public void updateUserFederationProvider(UserFederationProviderModel model) {
-		Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
-		while (it.hasNext()) {
-			UserFederationProviderEntity entity = it.next();
-			if (entity.getId().equals(model.getId())) {
-				entity.setProviderName(model.getProviderName());
-				entity.setConfig(model.getConfig());
-				entity.setPriority(model.getPriority());
-				String displayName = model.getDisplayName();
-				if (displayName != null) {
-					entity.setDisplayName(model.getDisplayName());
-				}
-				entity.setFullSyncPeriod(model.getFullSyncPeriod());
-				entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
-				entity.setLastSync(model.getLastSync());
-			}
-		}
-		updateRealm();
-	}
-
-	@Override
-	public List<UserFederationProviderModel> getUserFederationProviders() {
-		List<UserFederationProviderEntity> entities = realm.getUserFederationProviders();
-		List<UserFederationProviderEntity> copy = new LinkedList<UserFederationProviderEntity>();
-		for (UserFederationProviderEntity entity : entities) {
-			copy.add(entity);
-
-		}
-		Collections.sort(copy, new Comparator<UserFederationProviderEntity>() {
-
-			@Override
-			public int compare(UserFederationProviderEntity o1, UserFederationProviderEntity o2) {
-				return o1.getPriority() - o2.getPriority();
-			}
-
-		});
-		List<UserFederationProviderModel> result = new LinkedList<UserFederationProviderModel>();
-		for (UserFederationProviderEntity entity : copy) {
-			result.add(new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
-					.getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(), entity
-					.getLastSync()));
-		}
-
-		return result;
-	}
-
-	@Override
-	public void setUserFederationProviders(List<UserFederationProviderModel> providers) {
-		List<UserFederationProviderEntity> entities = new LinkedList<UserFederationProviderEntity>();
-		for (UserFederationProviderModel model : providers) {
-			UserFederationProviderEntity entity = new UserFederationProviderEntity();
-			if (model.getId() != null)
-				entity.setId(model.getId());
-			else
-				entity.setId(KeycloakModelUtils.generateId());
-			entity.setProviderName(model.getProviderName());
-			entity.setConfig(model.getConfig());
-			entity.setPriority(model.getPriority());
-			String displayName = model.getDisplayName();
-			if (displayName == null) {
-				entity.setDisplayName(entity.getId());
-			}
-			entity.setDisplayName(displayName);
-			entity.setFullSyncPeriod(model.getFullSyncPeriod());
-			entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
-			entity.setLastSync(model.getLastSync());
-			entities.add(entity);
-		}
-
-		realm.setUserFederationProviders(entities);
-		updateRealm();
-	}
-
-	@Override
-	public boolean isEventsEnabled() {
-		return realm.isEventsEnabled();
-	}
-
-	@Override
-	public void setEventsEnabled(boolean enabled) {
-		realm.setEventsEnabled(enabled);
-		updateRealm();
-	}
-
-	@Override
-	public long getEventsExpiration() {
-		return realm.getEventsExpiration();
-	}
-
-	@Override
-	public void setEventsExpiration(long expiration) {
-		realm.setEventsExpiration(expiration);
-		updateRealm();
-	}
-
-	@Override
-	public Set<String> getEventsListeners() {
-		return new HashSet<String>(realm.getEventsListeners());
-	}
-
-	@Override
-	public void setEventsListeners(Set<String> listeners) {
-		if (listeners != null) {
-			realm.setEventsListeners(new ArrayList<String>(listeners));
-		} else {
-			realm.setEventsListeners(Collections.EMPTY_LIST);
-		}
-		updateRealm();
-	}
-
-	@Override
-	public ApplicationModel getMasterAdminApp() {
-		MongoApplicationEntity appData = getMongoStore().loadEntity(MongoApplicationEntity.class, realm.getAdminAppId(),
-				invocationContext);
-		return appData != null ? new ApplicationAdapter(session, this, appData, invocationContext) : null;
-	}
-
-	@Override
-	public void setMasterAdminApp(ApplicationModel app) {
-		String adminAppId = app != null ? app.getId() : null;
-		realm.setAdminAppId(adminAppId);
-		updateRealm();
-	}
-
-	@Override
-	public MongoRealmEntity getMongoEntity() {
-		return realm;
-	}
-
-	@Override
-	public boolean isIdentityFederationEnabled() {
-		return this.realm.getIdentityProviders() != null && !this.realm.getIdentityProviders().isEmpty();
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if (this == o)
-			return true;
-		if (o == null || !(o instanceof RealmModel))
-			return false;
-
-		RealmModel that = (RealmModel) o;
-		return that.getId().equals(getId());
-	}
-
-	@Override
-	public int hashCode() {
-		return getId().hashCode();
-	}
+    private final MongoRealmEntity realm;
+    private final RealmProvider model;
+
+    protected volatile transient PublicKey publicKey;
+    protected volatile transient PrivateKey privateKey;
+    protected volatile transient X509Certificate certificate;
+    protected volatile transient Key codeSecretKey;
+
+    private volatile transient PasswordPolicy passwordPolicy;
+    private volatile transient KeycloakSession session;
+
+    public RealmAdapter(KeycloakSession session, MongoRealmEntity realmEntity,
+            MongoStoreInvocationContext invocationContext) {
+        super(invocationContext);
+        this.realm = realmEntity;
+        this.session = session;
+        this.model = session.realms();
+    }
+
+    @Override
+    public String getId() {
+        return realm.getId();
+    }
+
+    @Override
+    public String getName() {
+        return realm.getName();
+    }
+
+    @Override
+    public void setName(String name) {
+        realm.setName(name);
+        updateRealm();
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return realm.isEnabled();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        realm.setEnabled(enabled);
+        updateRealm();
+    }
+
+    @Override
+    public SslRequired getSslRequired() {
+        return SslRequired.valueOf(realm.getSslRequired());
+    }
+
+    @Override
+    public void setSslRequired(SslRequired sslRequired) {
+        realm.setSslRequired(sslRequired.name());
+        updateRealm();
+    }
+
+    @Override
+    public boolean isPasswordCredentialGrantAllowed() {
+        return realm.isPasswordCredentialGrantAllowed();
+    }
+
+    @Override
+    public void setPasswordCredentialGrantAllowed(boolean passwordCredentialGrantAllowed) {
+        realm.setPasswordCredentialGrantAllowed(passwordCredentialGrantAllowed);
+        updateRealm();
+    }
+
+    @Override
+    public boolean isRegistrationAllowed() {
+        return realm.isRegistrationAllowed();
+    }
+
+    @Override
+    public void setRegistrationAllowed(boolean registrationAllowed) {
+        realm.setRegistrationAllowed(registrationAllowed);
+        updateRealm();
+    }
+
+    public boolean isRegistrationEmailAsUsername() {
+        return realm.isRegistrationEmailAsUsername();
+    }
+
+    public void setRegistrationEmailAsUsername(boolean registrationEmailAsUsername) {
+        realm.setRegistrationEmailAsUsername(registrationEmailAsUsername);
+        updateRealm();
+    }
+
+    @Override
+    public boolean isRememberMe() {
+        return realm.isRememberMe();
+    }
+
+    @Override
+    public void setRememberMe(boolean rememberMe) {
+        realm.setRememberMe(rememberMe);
+        updateRealm();
+    }
+
+    @Override
+    public boolean isBruteForceProtected() {
+        return realm.isBruteForceProtected();
+    }
+
+    @Override
+    public void setBruteForceProtected(boolean value) {
+        realm.setBruteForceProtected(value);
+        updateRealm();
+    }
+
+    @Override
+    public int getMaxFailureWaitSeconds() {
+        return realm.getMaxFailureWaitSeconds();
+    }
+
+    @Override
+    public void setMaxFailureWaitSeconds(int val) {
+        realm.setMaxFailureWaitSeconds(val);
+        updateRealm();
+    }
+
+    @Override
+    public int getWaitIncrementSeconds() {
+        return realm.getWaitIncrementSeconds();
+    }
+
+    @Override
+    public void setWaitIncrementSeconds(int val) {
+        realm.setWaitIncrementSeconds(val);
+        updateRealm();
+    }
+
+    @Override
+    public long getQuickLoginCheckMilliSeconds() {
+        return realm.getQuickLoginCheckMilliSeconds();
+    }
+
+    @Override
+    public void setQuickLoginCheckMilliSeconds(long val) {
+        realm.setQuickLoginCheckMilliSeconds(val);
+        updateRealm();
+    }
+
+    @Override
+    public int getMinimumQuickLoginWaitSeconds() {
+        return realm.getMinimumQuickLoginWaitSeconds();
+    }
+
+    @Override
+    public void setMinimumQuickLoginWaitSeconds(int val) {
+        realm.setMinimumQuickLoginWaitSeconds(val);
+        updateRealm();
+    }
+
+    @Override
+    public int getMaxDeltaTimeSeconds() {
+        return realm.getMaxDeltaTimeSeconds();
+    }
+
+    @Override
+    public void setMaxDeltaTimeSeconds(int val) {
+        realm.setMaxDeltaTimeSeconds(val);
+        updateRealm();
+    }
+
+    @Override
+    public int getFailureFactor() {
+        return realm.getFailureFactor();
+    }
+
+    @Override
+    public void setFailureFactor(int failureFactor) {
+        realm.setFailureFactor(failureFactor);
+        updateRealm();
+    }
+
+    @Override
+    public boolean isVerifyEmail() {
+        return realm.isVerifyEmail();
+    }
+
+    @Override
+    public void setVerifyEmail(boolean verifyEmail) {
+        realm.setVerifyEmail(verifyEmail);
+        updateRealm();
+    }
+
+    @Override
+    public boolean isResetPasswordAllowed() {
+        return realm.isResetPasswordAllowed();
+    }
+
+    @Override
+    public void setResetPasswordAllowed(boolean resetPassword) {
+        realm.setResetPasswordAllowed(resetPassword);
+        updateRealm();
+    }
+
+    @Override
+    public PasswordPolicy getPasswordPolicy() {
+        if (passwordPolicy == null) {
+            passwordPolicy = new PasswordPolicy(realm.getPasswordPolicy());
+        }
+        return passwordPolicy;
+    }
+
+    @Override
+    public void setPasswordPolicy(PasswordPolicy policy) {
+        this.passwordPolicy = policy;
+        realm.setPasswordPolicy(policy.toString());
+        updateRealm();
+    }
+
+    @Override
+    public int getNotBefore() {
+        return realm.getNotBefore();
+    }
+
+    @Override
+    public void setNotBefore(int notBefore) {
+        realm.setNotBefore(notBefore);
+        updateRealm();
+    }
+
+    @Override
+    public int getSsoSessionIdleTimeout() {
+        return realm.getSsoSessionIdleTimeout();
+    }
+
+    @Override
+    public void setSsoSessionIdleTimeout(int seconds) {
+        realm.setSsoSessionIdleTimeout(seconds);
+        updateRealm();
+    }
+
+    @Override
+    public int getSsoSessionMaxLifespan() {
+        return realm.getSsoSessionMaxLifespan();
+    }
+
+    @Override
+    public void setSsoSessionMaxLifespan(int seconds) {
+        realm.setSsoSessionMaxLifespan(seconds);
+        updateRealm();
+    }
+
+    @Override
+    public int getAccessTokenLifespan() {
+        return realm.getAccessTokenLifespan();
+    }
+
+    @Override
+    public void setAccessTokenLifespan(int tokenLifespan) {
+        realm.setAccessTokenLifespan(tokenLifespan);
+        updateRealm();
+    }
+
+    @Override
+    public int getAccessCodeLifespan() {
+        return realm.getAccessCodeLifespan();
+    }
+
+    @Override
+    public void setAccessCodeLifespan(int accessCodeLifespan) {
+        realm.setAccessCodeLifespan(accessCodeLifespan);
+        updateRealm();
+    }
+
+    @Override
+    public int getAccessCodeLifespanUserAction() {
+        return realm.getAccessCodeLifespanUserAction();
+    }
+
+    @Override
+    public void setAccessCodeLifespanUserAction(int accessCodeLifespanUserAction) {
+        realm.setAccessCodeLifespanUserAction(accessCodeLifespanUserAction);
+        updateRealm();
+    }
+
+    @Override
+    public void setAccessCodeLifespanLogin(int accessCodeLifespanLogin) {
+        realm.setAccessCodeLifespanLogin(accessCodeLifespanLogin);
+        updateRealm();
+    }
+
+    @Override
+    public int getAccessCodeLifespanLogin() {
+        return realm.getAccessCodeLifespanLogin();
+    }
+
+    @Override
+    public String getPublicKeyPem() {
+        return realm.getPublicKeyPem();
+    }
+
+    @Override
+    public void setPublicKeyPem(String publicKeyPem) {
+        realm.setPublicKeyPem(publicKeyPem);
+        this.publicKey = null;
+        updateRealm();
+    }
+
+    @Override
+    public X509Certificate getCertificate() {
+        if (certificate != null)
+            return certificate;
+        certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
+        return certificate;
+    }
+
+    @Override
+    public void setCertificate(X509Certificate certificate) {
+        this.certificate = certificate;
+        String certificatePem = KeycloakModelUtils.getPemFromCertificate(certificate);
+        setCertificatePem(certificatePem);
+
+    }
+
+    @Override
+    public String getCertificatePem() {
+        return realm.getCertificatePem();
+    }
+
+    @Override
+    public void setCertificatePem(String certificate) {
+        realm.setCertificatePem(certificate);
+
+    }
+
+    @Override
+    public String getPrivateKeyPem() {
+        return realm.getPrivateKeyPem();
+    }
+
+    @Override
+    public void setPrivateKeyPem(String privateKeyPem) {
+        realm.setPrivateKeyPem(privateKeyPem);
+        this.privateKey = null;
+        updateRealm();
+    }
+
+    @Override
+    public PublicKey getPublicKey() {
+        if (publicKey != null)
+            return publicKey;
+        publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
+        return publicKey;
+    }
+
+    @Override
+    public void setPublicKey(PublicKey publicKey) {
+        this.publicKey = publicKey;
+        String publicKeyPem = KeycloakModelUtils.getPemFromKey(publicKey);
+        setPublicKeyPem(publicKeyPem);
+    }
+
+    @Override
+    public PrivateKey getPrivateKey() {
+        if (privateKey != null)
+            return privateKey;
+        privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
+        return privateKey;
+    }
+
+    @Override
+    public void setPrivateKey(PrivateKey privateKey) {
+        this.privateKey = privateKey;
+        String privateKeyPem = KeycloakModelUtils.getPemFromKey(privateKey);
+        setPrivateKeyPem(privateKeyPem);
+    }
+
+    @Override
+    public String getCodeSecret() {
+        return realm.getCodeSecret();
+    }
+
+    @Override
+    public Key getCodeSecretKey() {
+        if (codeSecretKey == null) {
+            codeSecretKey = KeycloakModelUtils.getSecretKey(getCodeSecret());
+        }
+        return codeSecretKey;
+    }
+
+    @Override
+    public void setCodeSecret(String codeSecret) {
+        realm.setCodeSecret(codeSecret);
+        updateRealm();
+    }
+
+    @Override
+    public String getLoginTheme() {
+        return realm.getLoginTheme();
+    }
+
+    @Override
+    public void setLoginTheme(String name) {
+        realm.setLoginTheme(name);
+        updateRealm();
+    }
+
+    @Override
+    public String getAccountTheme() {
+        return realm.getAccountTheme();
+    }
+
+    @Override
+    public void setAccountTheme(String name) {
+        realm.setAccountTheme(name);
+        updateRealm();
+    }
+
+    @Override
+    public String getAdminTheme() {
+        return realm.getAdminTheme();
+    }
+
+    @Override
+    public void setAdminTheme(String name) {
+        realm.setAdminTheme(name);
+        updateRealm();
+    }
+
+    @Override
+    public String getEmailTheme() {
+        return realm.getEmailTheme();
+    }
+
+    @Override
+    public void setEmailTheme(String name) {
+        realm.setEmailTheme(name);
+        updateRealm();
+    }
+
+    @Override
+    public RoleAdapter getRole(String name) {
+        DBObject query = new QueryBuilder().and("name").is(name).and("realmId").is(getId()).get();
+        MongoRoleEntity role = getMongoStore().loadSingleEntity(MongoRoleEntity.class, query, invocationContext);
+        if (role == null) {
+            return null;
+        } else {
+            return new RoleAdapter(session, this, role, this, invocationContext);
+        }
+    }
+
+    @Override
+    public RoleModel addRole(String name) {
+        return this.addRole(null, name);
+    }
+
+    @Override
+    public RoleModel addRole(String id, String name) {
+        MongoRoleEntity roleEntity = new MongoRoleEntity();
+        roleEntity.setId(id);
+        roleEntity.setName(name);
+        roleEntity.setRealmId(getId());
+
+        getMongoStore().insertEntity(roleEntity, invocationContext);
+
+        return new RoleAdapter(session, this, roleEntity, this, invocationContext);
+    }
+
+    @Override
+    public boolean removeRole(RoleModel role) {
+        return removeRoleById(role.getId());
+    }
+
+    @Override
+    public boolean removeRoleById(String id) {
+        RoleModel role = getRoleById(id);
+        if (role == null)
+            return false;
+        session.users().preRemove(this, role);
+        return getMongoStore().removeEntity(MongoRoleEntity.class, id, invocationContext);
+    }
+
+    @Override
+    public Set<RoleModel> getRoles() {
+        DBObject query = new QueryBuilder().and("realmId").is(getId()).get();
+        List<MongoRoleEntity> roles = getMongoStore().loadEntities(MongoRoleEntity.class, query, invocationContext);
+
+        Set<RoleModel> result = new HashSet<RoleModel>();
+
+        if (roles == null)
+            return result;
+        for (MongoRoleEntity role : roles) {
+            result.add(new RoleAdapter(session, this, role, this, invocationContext));
+        }
+
+        return result;
+    }
+
+    @Override
+    public RoleModel getRoleById(String id) {
+        return model.getRoleById(id, this);
+    }
+
+    @Override
+    public List<String> getDefaultRoles() {
+        return realm.getDefaultRoles();
+    }
+
+    @Override
+    public void addDefaultRole(String name) {
+        RoleModel role = getRole(name);
+        if (role == null) {
+            addRole(name);
+        }
+
+        getMongoStore().pushItemToList(realm, "defaultRoles", name, true, invocationContext);
+    }
+
+    @Override
+    public void updateDefaultRoles(String[] defaultRoles) {
+        List<String> roleNames = new ArrayList<String>();
+        for (String roleName : defaultRoles) {
+            RoleModel role = getRole(roleName);
+            if (role == null) {
+                addRole(roleName);
+            }
+
+            roleNames.add(roleName);
+        }
+
+        realm.setDefaultRoles(roleNames);
+        updateRealm();
+    }
+
+    @Override
+    public ClientModel findClient(String clientId) {
+        ClientModel model = getApplicationByName(clientId);
+        if (model != null)
+            return model;
+        return getOAuthClient(clientId);
+    }
+
+    @Override
+    public ClientModel findClientById(String id) {
+        ClientModel model = getApplicationById(id);
+        if (model != null)
+            return model;
+        return getOAuthClientById(id);
+    }
+
+    @Override
+    public ApplicationModel getApplicationById(String id) {
+        return model.getApplicationById(id, this);
+    }
+
+    @Override
+    public ApplicationModel getApplicationByName(String name) {
+        DBObject query = new QueryBuilder().and("realmId").is(getId()).and("name").is(name).get();
+        MongoApplicationEntity appEntity = getMongoStore().loadSingleEntity(MongoApplicationEntity.class, query,
+                invocationContext);
+        return appEntity == null ? null : new ApplicationAdapter(session, this, appEntity, invocationContext);
+    }
+
+    @Override
+    public Map<String, ApplicationModel> getApplicationNameMap() {
+        Map<String, ApplicationModel> resourceMap = new HashMap<String, ApplicationModel>();
+        for (ApplicationModel resource : getApplications()) {
+            resourceMap.put(resource.getName(), resource);
+        }
+        return resourceMap;
+    }
+
+    @Override
+    public List<ApplicationModel> getApplications() {
+        DBObject query = new QueryBuilder().and("realmId").is(getId()).get();
+        List<MongoApplicationEntity> appDatas = getMongoStore().loadEntities(MongoApplicationEntity.class, query,
+                invocationContext);
+
+        List<ApplicationModel> result = new ArrayList<ApplicationModel>();
+        for (MongoApplicationEntity appData : appDatas) {
+            result.add(new ApplicationAdapter(session, this, appData, invocationContext));
+        }
+        return result;
+    }
+
+    @Override
+    public ApplicationModel addApplication(String name) {
+        return this.addApplication(null, name);
+    }
+
+    @Override
+    public ApplicationModel addApplication(String id, String name) {
+        MongoApplicationEntity appData = new MongoApplicationEntity();
+        appData.setId(id);
+        appData.setName(name);
+        appData.setRealmId(getId());
+        appData.setEnabled(true);
+        getMongoStore().insertEntity(appData, invocationContext);
+
+        final ApplicationModel model = new ApplicationAdapter(session, this, appData, invocationContext);
+        session.getKeycloakSessionFactory().publish(new ApplicationCreationEvent() {
+            @Override
+            public ApplicationModel getCreatedApplication() {
+                return model;
+            }
+
+            @Override
+            public ClientModel getCreatedClient() {
+                return model;
+            }
+        });
+        return model;
+    }
+
+    @Override
+    public boolean removeApplication(String id) {
+        return getMongoStore().removeEntity(MongoApplicationEntity.class, id, invocationContext);
+    }
+
+    @Override
+    public OAuthClientModel addOAuthClient(String name) {
+        return this.addOAuthClient(null, name);
+    }
+
+    @Override
+    public OAuthClientModel addOAuthClient(String id, String name) {
+        MongoOAuthClientEntity oauthClient = new MongoOAuthClientEntity();
+        oauthClient.setId(id);
+        oauthClient.setRealmId(getId());
+        oauthClient.setName(name);
+        getMongoStore().insertEntity(oauthClient, invocationContext);
+
+        final OAuthClientAdapter model = new OAuthClientAdapter(session, this, oauthClient, invocationContext);
+        session.getKeycloakSessionFactory().publish(new OAuthClientCreationEvent() {
+            @Override
+            public OAuthClientModel getCreatedOAuthClient() {
+                return model;
+            }
+
+            @Override
+            public ClientModel getCreatedClient() {
+                return model;
+            }
+        });
+        return model;
+    }
+
+    @Override
+    public boolean removeOAuthClient(String id) {
+        return getMongoStore().removeEntity(MongoOAuthClientEntity.class, id, invocationContext);
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClient(String name) {
+        DBObject query = new QueryBuilder().and("realmId").is(getId()).and("name").is(name).get();
+        MongoOAuthClientEntity oauthClient = getMongoStore().loadSingleEntity(MongoOAuthClientEntity.class, query,
+                invocationContext);
+        return oauthClient == null ? null : new OAuthClientAdapter(session, this, oauthClient, invocationContext);
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClientById(String id) {
+        return model.getOAuthClientById(id, this);
+    }
+
+    @Override
+    public List<OAuthClientModel> getOAuthClients() {
+        DBObject query = new QueryBuilder().and("realmId").is(getId()).get();
+        List<MongoOAuthClientEntity> results = getMongoStore().loadEntities(MongoOAuthClientEntity.class, query,
+                invocationContext);
+        List<OAuthClientModel> list = new ArrayList<OAuthClientModel>();
+        for (MongoOAuthClientEntity data : results) {
+            list.add(new OAuthClientAdapter(session, this, data, invocationContext));
+        }
+        return list;
+    }
+
+    @Override
+    public void addRequiredCredential(String type) {
+        RequiredCredentialModel credentialModel = initRequiredCredentialModel(type);
+        addRequiredCredential(credentialModel, realm.getRequiredCredentials());
+    }
+
+    protected void addRequiredCredential(RequiredCredentialModel credentialModel,
+            List<RequiredCredentialEntity> persistentCollection) {
+        RequiredCredentialEntity credEntity = new RequiredCredentialEntity();
+        credEntity.setType(credentialModel.getType());
+        credEntity.setFormLabel(credentialModel.getFormLabel());
+        credEntity.setInput(credentialModel.isInput());
+        credEntity.setSecret(credentialModel.isSecret());
+
+        persistentCollection.add(credEntity);
+
+        updateRealm();
+    }
+
+    @Override
+    public void updateRequiredCredentials(Set<String> creds) {
+        updateRequiredCredentials(creds, realm.getRequiredCredentials());
+    }
+
+    protected void updateRequiredCredentials(Set<String> creds, List<RequiredCredentialEntity> credsEntities) {
+        Set<String> already = new HashSet<String>();
+        Set<RequiredCredentialEntity> toRemove = new HashSet<RequiredCredentialEntity>();
+        for (RequiredCredentialEntity entity : credsEntities) {
+            if (!creds.contains(entity.getType())) {
+                toRemove.add(entity);
+            } else {
+                already.add(entity.getType());
+            }
+        }
+        for (RequiredCredentialEntity entity : toRemove) {
+            credsEntities.remove(entity);
+        }
+        for (String cred : creds) {
+            if (!already.contains(cred)) {
+                RequiredCredentialModel credentialModel = initRequiredCredentialModel(cred);
+                addRequiredCredential(credentialModel, credsEntities);
+            }
+        }
+        updateRealm();
+    }
+
+    @Override
+    public List<RequiredCredentialModel> getRequiredCredentials() {
+        return convertRequiredCredentialEntities(realm.getRequiredCredentials());
+    }
+
+    protected List<RequiredCredentialModel> convertRequiredCredentialEntities(
+            Collection<RequiredCredentialEntity> credEntities) {
+
+        List<RequiredCredentialModel> result = new ArrayList<RequiredCredentialModel>();
+        for (RequiredCredentialEntity entity : credEntities) {
+            RequiredCredentialModel model = new RequiredCredentialModel();
+            model.setFormLabel(entity.getFormLabel());
+            model.setInput(entity.isInput());
+            model.setSecret(entity.isSecret());
+            model.setType(entity.getType());
+
+            result.add(model);
+        }
+        return result;
+    }
+
+    protected void updateRealm() {
+        super.updateMongoEntity();
+    }
+
+    protected RequiredCredentialModel initRequiredCredentialModel(String type) {
+        RequiredCredentialModel model = RequiredCredentialModel.BUILT_IN.get(type);
+        if (model == null) {
+            throw new RuntimeException("Unknown credential type " + type);
+        }
+        return model;
+    }
+
+    @Override
+    public Map<String, String> getBrowserSecurityHeaders() {
+        return realm.getBrowserSecurityHeaders();
+    }
+
+    @Override
+    public void setBrowserSecurityHeaders(Map<String, String> headers) {
+        realm.setBrowserSecurityHeaders(headers);
+        updateRealm();
+    }
+
+    @Override
+    public Map<String, String> getSmtpConfig() {
+        return realm.getSmtpConfig();
+    }
+
+    @Override
+    public void setSmtpConfig(Map<String, String> smtpConfig) {
+        realm.setSmtpConfig(smtpConfig);
+        updateRealm();
+    }
+
+    @Override
+    public List<IdentityProviderModel> getIdentityProviders() {
+        List<IdentityProviderModel> identityProviders = new ArrayList<IdentityProviderModel>();
+
+        for (IdentityProviderEntity entity : realm.getIdentityProviders()) {
+            IdentityProviderModel identityProviderModel = new IdentityProviderModel();
+
+            identityProviderModel.setProviderId(entity.getProviderId());
+            identityProviderModel.setId(entity.getId());
+            identityProviderModel.setInternalId(entity.getInternalId());
+            identityProviderModel.setName(entity.getName());
+            identityProviderModel.setConfig(entity.getConfig());
+            identityProviderModel.setEnabled(entity.isEnabled());
+            identityProviderModel.setUpdateProfileFirstLogin(entity.isUpdateProfileFirstLogin());
+            identityProviderModel.setAuthenticateByDefault(entity.isAuthenticateByDefault());
+            identityProviderModel.setStoreToken(entity.isStoreToken());
+
+            identityProviders.add(identityProviderModel);
+        }
+
+        return identityProviders;
+    }
+
+    @Override
+    public IdentityProviderModel getIdentityProviderById(String identityProviderId) {
+        for (IdentityProviderModel identityProviderModel : getIdentityProviders()) {
+            if (identityProviderModel.getId().equals(identityProviderId)) {
+                return identityProviderModel;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public void addIdentityProvider(IdentityProviderModel identityProvider) {
+        IdentityProviderEntity entity = new IdentityProviderEntity();
+
+        entity.setInternalId(KeycloakModelUtils.generateId());
+        entity.setId(identityProvider.getId());
+        entity.setProviderId(identityProvider.getProviderId());
+        entity.setName(identityProvider.getName());
+        entity.setEnabled(identityProvider.isEnabled());
+        entity.setUpdateProfileFirstLogin(identityProvider.isUpdateProfileFirstLogin());
+        entity.setStoreToken(identityProvider.isStoreToken());
+        entity.setAuthenticateByDefault(identityProvider.isAuthenticateByDefault());
+        entity.setConfig(identityProvider.getConfig());
+
+        realm.getIdentityProviders().add(entity);
+        updateRealm();
+    }
+
+    @Override
+    public void removeIdentityProviderById(String providerId) {
+        IdentityProviderEntity toRemove;
+        for (IdentityProviderEntity entity : realm.getIdentityProviders()) {
+            if (entity.getId().equals(providerId)) {
+                realm.getIdentityProviders().remove(entity);
+                updateRealm();
+                break;
+            }
+        }
+    }
+
+    @Override
+    public void updateIdentityProvider(IdentityProviderModel identityProvider) {
+        for (IdentityProviderEntity entity : this.realm.getIdentityProviders()) {
+            if (entity.getInternalId().equals(identityProvider.getInternalId())) {
+                entity.setId(identityProvider.getId());
+                entity.setName(identityProvider.getName());
+                entity.setEnabled(identityProvider.isEnabled());
+                entity.setUpdateProfileFirstLogin(identityProvider.isUpdateProfileFirstLogin());
+                entity.setAuthenticateByDefault(identityProvider.isAuthenticateByDefault());
+                entity.setStoreToken(identityProvider.isStoreToken());
+                entity.setConfig(identityProvider.getConfig());
+            }
+        }
+
+        updateRealm();
+    }
+
+    @Override
+    public UserFederationProviderModel addUserFederationProvider(String providerName, Map<String, String> config,
+            int priority, String displayName, int fullSyncPeriod, int changedSyncPeriod, int lastSync) {
+        UserFederationProviderEntity entity = new UserFederationProviderEntity();
+        entity.setId(KeycloakModelUtils.generateId());
+        entity.setPriority(priority);
+        entity.setProviderName(providerName);
+        entity.setConfig(config);
+        if (displayName == null) {
+            displayName = entity.getId();
+        }
+        entity.setDisplayName(displayName);
+        entity.setFullSyncPeriod(fullSyncPeriod);
+        entity.setChangedSyncPeriod(changedSyncPeriod);
+        entity.setLastSync(lastSync);
+        realm.getUserFederationProviders().add(entity);
+        updateRealm();
+
+        return new UserFederationProviderModel(entity.getId(), providerName, config, priority, displayName, fullSyncPeriod,
+                changedSyncPeriod, lastSync);
+    }
+
+    @Override
+    public void removeUserFederationProvider(UserFederationProviderModel provider) {
+        Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
+        while (it.hasNext()) {
+            UserFederationProviderEntity entity = it.next();
+            if (entity.getId().equals(provider.getId())) {
+                session.users().preRemove(
+                        this,
+                        new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
+                                .getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(),
+                                entity.getLastSync()));
+                it.remove();
+            }
+        }
+        updateRealm();
+    }
+
+    @Override
+    public void updateUserFederationProvider(UserFederationProviderModel model) {
+        Iterator<UserFederationProviderEntity> it = realm.getUserFederationProviders().iterator();
+        while (it.hasNext()) {
+            UserFederationProviderEntity entity = it.next();
+            if (entity.getId().equals(model.getId())) {
+                entity.setProviderName(model.getProviderName());
+                entity.setConfig(model.getConfig());
+                entity.setPriority(model.getPriority());
+                String displayName = model.getDisplayName();
+                if (displayName != null) {
+                    entity.setDisplayName(model.getDisplayName());
+                }
+                entity.setFullSyncPeriod(model.getFullSyncPeriod());
+                entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
+                entity.setLastSync(model.getLastSync());
+            }
+        }
+        updateRealm();
+    }
+
+    @Override
+    public List<UserFederationProviderModel> getUserFederationProviders() {
+        List<UserFederationProviderEntity> entities = realm.getUserFederationProviders();
+        List<UserFederationProviderEntity> copy = new LinkedList<UserFederationProviderEntity>();
+        for (UserFederationProviderEntity entity : entities) {
+            copy.add(entity);
+
+        }
+        Collections.sort(copy, new Comparator<UserFederationProviderEntity>() {
+
+            @Override
+            public int compare(UserFederationProviderEntity o1, UserFederationProviderEntity o2) {
+                return o1.getPriority() - o2.getPriority();
+            }
+
+        });
+        List<UserFederationProviderModel> result = new LinkedList<UserFederationProviderModel>();
+        for (UserFederationProviderEntity entity : copy) {
+            result.add(new UserFederationProviderModel(entity.getId(), entity.getProviderName(), entity.getConfig(), entity
+                    .getPriority(), entity.getDisplayName(), entity.getFullSyncPeriod(), entity.getChangedSyncPeriod(), entity
+                    .getLastSync()));
+        }
+
+        return result;
+    }
+
+    @Override
+    public void setUserFederationProviders(List<UserFederationProviderModel> providers) {
+        List<UserFederationProviderEntity> entities = new LinkedList<UserFederationProviderEntity>();
+        for (UserFederationProviderModel model : providers) {
+            UserFederationProviderEntity entity = new UserFederationProviderEntity();
+            if (model.getId() != null)
+                entity.setId(model.getId());
+            else
+                entity.setId(KeycloakModelUtils.generateId());
+            entity.setProviderName(model.getProviderName());
+            entity.setConfig(model.getConfig());
+            entity.setPriority(model.getPriority());
+            String displayName = model.getDisplayName();
+            if (displayName == null) {
+                entity.setDisplayName(entity.getId());
+            }
+            entity.setDisplayName(displayName);
+            entity.setFullSyncPeriod(model.getFullSyncPeriod());
+            entity.setChangedSyncPeriod(model.getChangedSyncPeriod());
+            entity.setLastSync(model.getLastSync());
+            entities.add(entity);
+        }
+
+        realm.setUserFederationProviders(entities);
+        updateRealm();
+    }
+
+    @Override
+    public boolean isEventsEnabled() {
+        return realm.isEventsEnabled();
+    }
+
+    @Override
+    public void setEventsEnabled(boolean enabled) {
+        realm.setEventsEnabled(enabled);
+        updateRealm();
+    }
+
+    @Override
+    public long getEventsExpiration() {
+        return realm.getEventsExpiration();
+    }
+
+    @Override
+    public void setEventsExpiration(long expiration) {
+        realm.setEventsExpiration(expiration);
+        updateRealm();
+    }
+
+    @Override
+    public Set<String> getEventsListeners() {
+        return new HashSet<String>(realm.getEventsListeners());
+    }
+
+    @Override
+    public void setEventsListeners(Set<String> listeners) {
+        if (listeners != null) {
+            realm.setEventsListeners(new ArrayList<String>(listeners));
+        } else {
+            realm.setEventsListeners(Collections.EMPTY_LIST);
+        }
+        updateRealm();
+    }
+
+    @Override
+    public ApplicationModel getMasterAdminApp() {
+        MongoApplicationEntity appData = getMongoStore().loadEntity(MongoApplicationEntity.class, realm.getAdminAppId(),
+                invocationContext);
+        return appData != null ? new ApplicationAdapter(session, this, appData, invocationContext) : null;
+    }
+
+    @Override
+    public void setMasterAdminApp(ApplicationModel app) {
+        String adminAppId = app != null ? app.getId() : null;
+        realm.setAdminAppId(adminAppId);
+        updateRealm();
+    }
+
+    @Override
+    public MongoRealmEntity getMongoEntity() {
+        return realm;
+    }
+
+    @Override
+    public boolean isIdentityFederationEnabled() {
+        return this.realm.getIdentityProviders() != null && !this.realm.getIdentityProviders().isEmpty();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || !(o instanceof RealmModel))
+            return false;
+
+        RealmModel that = (RealmModel) o;
+        return that.getId().equals(getId());
+    }
+
+    @Override
+    public int hashCode() {
+        return getId().hashCode();
+    }
 
 }
diff --git a/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java b/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java
index dfaa14f..252a081 100755
--- a/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java
+++ b/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java
@@ -21,59 +21,59 @@ import org.keycloak.representations.idm.CredentialRepresentation;
  */
 public class ApplianceBootstrap {
 
-	private static final Logger logger = Logger.getLogger(ApplianceBootstrap.class);
+    private static final Logger logger = Logger.getLogger(ApplianceBootstrap.class);
 
-	public void bootstrap(KeycloakSessionFactory sessionFactory, String contextPath) {
-		KeycloakSession session = sessionFactory.create();
-		session.getTransaction().begin();
+    public void bootstrap(KeycloakSessionFactory sessionFactory, String contextPath) {
+        KeycloakSession session = sessionFactory.create();
+        session.getTransaction().begin();
 
-		try {
-			bootstrap(session, contextPath);
-			session.getTransaction().commit();
-		} finally {
-			session.close();
-		}
-	}
+        try {
+            bootstrap(session, contextPath);
+            session.getTransaction().commit();
+        } finally {
+            session.close();
+        }
+    }
 
-	public void bootstrap(KeycloakSession session, String contextPath) {
-		String adminRealmName = Config.getAdminRealm();
-		if (session.realms().getRealm(adminRealmName) != null) {
-			return;
-		}
+    public void bootstrap(KeycloakSession session, String contextPath) {
+        String adminRealmName = Config.getAdminRealm();
+        if (session.realms().getRealm(adminRealmName) != null) {
+            return;
+        }
 
-		logger.info("Initializing " + adminRealmName + " realm");
+        logger.info("Initializing " + adminRealmName + " realm");
 
-		RealmManager manager = new RealmManager(session);
-		manager.setContextPath(contextPath);
-		RealmModel realm = manager.createRealm(adminRealmName, adminRealmName);
-		realm.setName(adminRealmName);
-		realm.setEnabled(true);
-		realm.addRequiredCredential(CredentialRepresentation.PASSWORD);
-		realm.setSsoSessionIdleTimeout(1800);
-		realm.setAccessTokenLifespan(60);
-		realm.setSsoSessionMaxLifespan(36000);
-		realm.setAccessCodeLifespan(60);
-		realm.setAccessCodeLifespanUserAction(300);
-		realm.setSslRequired(SslRequired.EXTERNAL);
-		realm.setRegistrationAllowed(false);
-		realm.setRegistrationEmailAsUsername(false);
-		KeycloakModelUtils.generateRealmKeys(realm);
+        RealmManager manager = new RealmManager(session);
+        manager.setContextPath(contextPath);
+        RealmModel realm = manager.createRealm(adminRealmName, adminRealmName);
+        realm.setName(adminRealmName);
+        realm.setEnabled(true);
+        realm.addRequiredCredential(CredentialRepresentation.PASSWORD);
+        realm.setSsoSessionIdleTimeout(1800);
+        realm.setAccessTokenLifespan(60);
+        realm.setSsoSessionMaxLifespan(36000);
+        realm.setAccessCodeLifespan(60);
+        realm.setAccessCodeLifespanUserAction(300);
+        realm.setSslRequired(SslRequired.EXTERNAL);
+        realm.setRegistrationAllowed(false);
+        realm.setRegistrationEmailAsUsername(false);
+        KeycloakModelUtils.generateRealmKeys(realm);
 
-		UserModel adminUser = session.users().addUser(realm, "admin");
-		adminUser.setEnabled(true);
-		UserCredentialModel password = new UserCredentialModel();
-		password.setType(UserCredentialModel.PASSWORD);
-		password.setValue("admin");
-		session.users().updateCredential(realm, adminUser, password);
-		adminUser.addRequiredAction(UserModel.RequiredAction.UPDATE_PASSWORD);
+        UserModel adminUser = session.users().addUser(realm, "admin");
+        adminUser.setEnabled(true);
+        UserCredentialModel password = new UserCredentialModel();
+        password.setType(UserCredentialModel.PASSWORD);
+        password.setValue("admin");
+        session.users().updateCredential(realm, adminUser, password);
+        adminUser.addRequiredAction(UserModel.RequiredAction.UPDATE_PASSWORD);
 
-		RoleModel adminRole = realm.getRole(AdminRoles.ADMIN);
-		adminUser.grantRole(adminRole);
+        RoleModel adminRole = realm.getRole(AdminRoles.ADMIN);
+        adminUser.grantRole(adminRole);
 
-		ApplicationModel accountApp = realm.getApplicationNameMap().get(Constants.ACCOUNT_MANAGEMENT_APP);
-		for (String r : accountApp.getDefaultRoles()) {
-			adminUser.grantRole(accountApp.getRole(r));
-		}
-	}
+        ApplicationModel accountApp = realm.getApplicationNameMap().get(Constants.ACCOUNT_MANAGEMENT_APP);
+        for (String r : accountApp.getDefaultRoles()) {
+            adminUser.grantRole(accountApp.getRole(r));
+        }
+    }
 
 }
diff --git a/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java b/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java
index 4ee3169..0587876 100755
--- a/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java
+++ b/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java
@@ -80,820 +80,861 @@ import org.keycloak.services.validation.Validation;
  */
 public class LoginActionsService {
 
-	protected static final Logger logger = Logger.getLogger(LoginActionsService.class);
-
-	public static final String ACTION_COOKIE = "KEYCLOAK_ACTION";
-
-	private RealmModel realm;
-
-	@Context
-	private HttpRequest request;
-
-	@Context
-	protected HttpHeaders headers;
-
-	@Context
-	private UriInfo uriInfo;
-
-	@Context
-	private ClientConnection clientConnection;
-
-	@Context
-	protected Providers providers;
-
-	@Context
-	protected KeycloakSession session;
-
-	private AuthenticationManager authManager;
-
-	private EventBuilder event;
-
-	public static UriBuilder loginActionsBaseUrl(UriInfo uriInfo) {
-		UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
-		return loginActionsBaseUrl(baseUriBuilder);
-	}
-
-	public static UriBuilder loginActionsBaseUrl(UriBuilder baseUriBuilder) {
-		return baseUriBuilder.path(RealmsResource.class).path(RealmsResource.class, "getLoginActionsService");
-	}
-
-	public static UriBuilder processLoginUrl(UriInfo uriInfo) {
-		UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
-		return processLoginUrl(baseUriBuilder);
-	}
-
-	public static UriBuilder processLoginUrl(UriBuilder baseUriBuilder) {
-		UriBuilder uriBuilder = loginActionsBaseUrl(baseUriBuilder);
-		return uriBuilder.path(OIDCLoginProtocolService.class, "processLogin");
-	}
-
-	public static UriBuilder processOAuthUrl(UriInfo uriInfo) {
-		UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
-		return processOAuthUrl(baseUriBuilder);
-	}
-
-	public static UriBuilder processOAuthUrl(UriBuilder baseUriBuilder) {
-		UriBuilder uriBuilder = loginActionsBaseUrl(baseUriBuilder);
-		return uriBuilder.path(OIDCLoginProtocolService.class, "processOAuth");
-	}
-
-	public LoginActionsService(RealmModel realm, AuthenticationManager authManager, EventBuilder event) {
-		this.realm = realm;
-		this.authManager = authManager;
-		this.event = event;
-	}
-
-	private boolean checkSsl() {
-		if (uriInfo.getBaseUri().getScheme().equals("https")) {
-			return true;
-		} else {
-			return !realm.getSslRequired().isRequired(clientConnection);
-		}
-	}
-
-	private class Checks {
-		ClientSessionCode clientCode;
-		Response response;
-
-		boolean check(String code, ClientSessionModel.Action requiredAction) {
-			if (!check(code)) {
-				return false;
-			} else if (!clientCode.isValid(requiredAction)) {
-				event.error(Errors.INVALID_CODE);
-				response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
-						"Invalid code, please login again through your application.");
-				return false;
-			} else {
-				return true;
-			}
-		}
-
-		boolean check(String code, ClientSessionModel.Action requiredAction,
-				ClientSessionModel.Action alternativeRequiredAction) {
-			if (!check(code)) {
-				return false;
-			} else if (!(clientCode.isValid(requiredAction) || clientCode.isValid(alternativeRequiredAction))) {
-				event.error(Errors.INVALID_CODE);
-				response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
-						"Invalid code, please login again through your application.");
-				return false;
-			} else {
-				return true;
-			}
-		}
-
-		public boolean check(String code) {
-			if (!checkSsl()) {
-				event.error(Errors.SSL_REQUIRED);
-				response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
-				return false;
-			}
-			if (!realm.isEnabled()) {
-				event.error(Errors.REALM_DISABLED);
-				response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled.");
-				return false;
-			}
-			clientCode = ClientSessionCode.parse(code, session, realm);
-			if (clientCode == null) {
-				event.error(Errors.INVALID_CODE);
-				response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
-						"Unknown code, please login again through your application.");
-				return false;
-			}
-			return true;
-		}
-	}
-
-	/**
-	 * protocol independent login page entry point
-	 * 
-	 * 
-	 * @param code
-	 * @return
-	 */
-	@Path("login")
-	@GET
-	public Response loginPage(@QueryParam("code") String code) {
-		event.event(EventType.LOGIN);
-		Checks checks = new Checks();
-		if (!checks.check(code)) {
-			return checks.response;
-		}
-		event.detail(Details.CODE_ID, code);
-		ClientSessionCode clientSessionCode = checks.clientCode;
-		ClientSessionModel clientSession = clientSessionCode.getClientSession();
-
-		if (clientSession.getAction().equals(ClientSessionModel.Action.RECOVER_PASSWORD)) {
-			TokenManager.dettachClientSession(session.sessions(), realm, clientSession);
-			clientSession.setAction(ClientSessionModel.Action.AUTHENTICATE);
-		}
-
-		LoginFormsProvider forms = Flows.forms(session, realm, clientSession.getClient(), uriInfo).setClientSessionCode(
-				clientSessionCode.getCode());
-
-		return forms.createLogin();
-	}
-
-	/**
-	 * protocol independent registration page entry point
-	 * 
-	 * @param code
-	 * @return
-	 */
-	@Path("registration")
-	@GET
-	public Response registerPage(@QueryParam("code") String code) {
-		event.event(EventType.REGISTER);
-		if (!realm.isRegistrationAllowed()) {
-			event.error(Errors.REGISTRATION_DISABLED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Registration not allowed");
-		}
-
-		Checks checks = new Checks();
-		if (!checks.check(code)) {
-			return checks.response;
-		}
-		event.detail(Details.CODE_ID, code);
-		ClientSessionCode clientSessionCode = checks.clientCode;
-		ClientSessionModel clientSession = clientSessionCode.getClientSession();
-
-		authManager.expireIdentityCookie(realm, uriInfo, clientConnection);
-
-		return Flows.forms(session, realm, clientSession.getClient(), uriInfo)
-				.setClientSessionCode(clientSessionCode.getCode()).createRegistration();
-	}
-
-	/**
-	 * URL called after login page. YOU SHOULD NEVER INVOKE THIS DIRECTLY!
-	 * 
-	 * @param code
-	 * @param formData
-	 * @return
-	 */
-	@Path("request/login")
-	@POST
-	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-	public Response processLogin(@QueryParam("code") String code, final MultivaluedMap<String, String> formData) {
-		event.event(EventType.LOGIN);
-		if (!checkSsl()) {
-			event.error(Errors.SSL_REQUIRED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
-		}
-
-		if (!realm.isEnabled()) {
-			event.error(Errors.REALM_DISABLED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled.");
-		}
-		ClientSessionCode clientCode = ClientSessionCode.parse(code, session, realm);
-		if (clientCode == null) {
-			event.error(Errors.INVALID_CODE);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
-					"Unknown code, please login again through your application.");
-		}
-
-		ClientSessionModel clientSession = clientCode.getClientSession();
-		event.detail(Details.CODE_ID, clientSession.getId());
-
-		if (!clientCode.isValid(ClientSessionModel.Action.AUTHENTICATE) || clientSession.getUserSession() != null) {
-			clientCode.setAction(ClientSessionModel.Action.AUTHENTICATE);
-			event.client(clientSession.getClient()).error(Errors.EXPIRED_CODE);
-			return Flows.forms(this.session, realm, clientSession.getClient(), uriInfo).setError(Messages.EXPIRED_CODE)
-					.setClientSessionCode(clientCode.getCode()).createLogin();
-		}
-
-		String username = formData.getFirst(AuthenticationManager.FORM_USERNAME);
-
-		String rememberMe = formData.getFirst("rememberMe");
-		boolean remember = rememberMe != null && rememberMe.equalsIgnoreCase("on");
-
-		event.client(clientSession.getClient().getClientId()).detail(Details.REDIRECT_URI, clientSession.getRedirectUri())
-				.detail(Details.RESPONSE_TYPE, "code").detail(Details.AUTH_METHOD, "form").detail(Details.USERNAME, username);
-
-		if (remember) {
-			event.detail(Details.REMEMBER_ME, "true");
-		}
-
-		ClientModel client = clientSession.getClient();
-		if (client == null) {
-			event.error(Errors.CLIENT_NOT_FOUND);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown login requester.");
-		}
-		if (!client.isEnabled()) {
-			event.error(Errors.CLIENT_NOT_FOUND);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Login requester not enabled.");
-		}
-
-		if (formData.containsKey("cancel")) {
-			event.error(Errors.REJECTED_BY_USER);
-			LoginProtocol protocol = session.getProvider(LoginProtocol.class, clientSession.getAuthMethod());
-			protocol.setRealm(realm).setUriInfo(uriInfo);
-			return protocol.cancelLogin(clientSession);
-		}
-
-		AuthenticationManager.AuthenticationStatus status = authManager.authenticateForm(session, clientConnection, realm,
-				formData);
-
-		if (remember) {
-			authManager.createRememberMeCookie(realm, username, uriInfo, clientConnection);
-		} else {
-			authManager.expireRememberMeCookie(realm, uriInfo, clientConnection);
-		}
-
-		UserModel user = KeycloakModelUtils.findUserByNameOrEmail(session, realm, username);
-		if (user != null) {
-			event.user(user);
-		}
-
-		switch (status) {
-		case SUCCESS:
-		case ACTIONS_REQUIRED:
-			UserSessionModel userSession = session.sessions().createUserSession(realm, user, username,
-					clientConnection.getRemoteAddr(), "form", remember);
-			TokenManager.attachClientSession(userSession, clientSession);
-			event.session(userSession);
-			return authManager.nextActionAfterAuthentication(session, userSession, clientSession, clientConnection, request,
-					uriInfo, event);
-		case ACCOUNT_TEMPORARILY_DISABLED:
-			event.error(Errors.USER_TEMPORARILY_DISABLED);
-			return Flows.forms(this.session, realm, client, uriInfo).setError(Messages.ACCOUNT_TEMPORARILY_DISABLED)
-					.setFormData(formData).setClientSessionCode(clientCode.getCode()).createLogin();
-		case ACCOUNT_DISABLED:
-			event.error(Errors.USER_DISABLED);
-			return Flows.forms(this.session, realm, client, uriInfo).setError(Messages.ACCOUNT_DISABLED)
-					.setClientSessionCode(clientCode.getCode()).setFormData(formData).createLogin();
-		case MISSING_TOTP:
-			formData.remove(CredentialRepresentation.PASSWORD);
-
-			String passwordToken = new JWSBuilder().jsonContent(new PasswordToken(realm.getName(), user.getId())).rsa256(
-					realm.getPrivateKey());
-			formData.add(CredentialRepresentation.PASSWORD_TOKEN, passwordToken);
-
-			return Flows.forms(this.session, realm, client, uriInfo).setFormData(formData)
-					.setClientSessionCode(clientCode.getCode()).createLoginTotp();
-		case INVALID_USER:
-			event.error(Errors.USER_NOT_FOUND);
-			return Flows.forms(this.session, realm, client, uriInfo).setError(Messages.INVALID_USER).setFormData(formData)
-					.setClientSessionCode(clientCode.getCode()).createLogin();
-		default:
-			event.error(Errors.INVALID_USER_CREDENTIALS);
-			return Flows.forms(this.session, realm, client, uriInfo).setError(Messages.INVALID_USER).setFormData(formData)
-					.setClientSessionCode(clientCode.getCode()).createLogin();
-		}
-	}
-
-	/**
-	 * Registration
-	 * 
-	 * @param code
-	 * @param formData
-	 * @return
-	 */
-	@Path("request/registration")
-	@POST
-	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-	public Response processRegister(@QueryParam("code") String code, final MultivaluedMap<String, String> formData) {
-		event.event(EventType.REGISTER);
-		if (!checkSsl()) {
-			event.error(Errors.SSL_REQUIRED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
-		}
-
-		if (!realm.isEnabled()) {
-			event.error(Errors.REALM_DISABLED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled.");
-		}
-		if (!realm.isRegistrationAllowed()) {
-			event.error(Errors.REGISTRATION_DISABLED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Registration not allowed");
-		}
-		ClientSessionCode clientCode = ClientSessionCode.parse(code, session, realm);
-		if (clientCode == null) {
-			event.error(Errors.INVALID_CODE);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
-					"Unknown code, please login again through your application.");
-		}
-		if (!clientCode.isValid(ClientSessionModel.Action.AUTHENTICATE)) {
-			event.error(Errors.INVALID_CODE);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
-					"Invalid code, please login again through your application.");
-		}
-
-		String username = formData.getFirst("username");
-		String email = formData.getFirst("email");
-		if (realm.isRegistrationEmailAsUsername()) {
-			username = email;
-			formData.putSingle(AuthenticationManager.FORM_USERNAME, username);
-		}
-		ClientSessionModel clientSession = clientCode.getClientSession();
-		event.client(clientSession.getClient()).detail(Details.REDIRECT_URI, clientSession.getRedirectUri())
-				.detail(Details.RESPONSE_TYPE, "code").detail(Details.USERNAME, username).detail(Details.EMAIL, email)
-				.detail(Details.REGISTER_METHOD, "form");
-
-		if (!realm.isEnabled()) {
-			event.error(Errors.REALM_DISABLED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled");
-		}
-		ClientModel client = clientSession.getClient();
-		if (client == null) {
-			event.error(Errors.CLIENT_NOT_FOUND);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown login requester.");
-		}
-
-		if (!client.isEnabled()) {
-			event.error(Errors.CLIENT_DISABLED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Login requester not enabled.");
-		}
-
-		List<String> requiredCredentialTypes = new LinkedList<String>();
-		for (RequiredCredentialModel m : realm.getRequiredCredentials()) {
-			requiredCredentialTypes.add(m.getType());
-		}
-
-		// Validate here, so user is not created if password doesn't validate to passwordPolicy of current realm
-		String error = Validation.validateRegistrationForm(realm, formData, requiredCredentialTypes);
-		if (error == null) {
-			error = Validation.validatePassword(formData, realm.getPasswordPolicy());
-		}
-
-		if (error != null) {
-			event.error(Errors.INVALID_REGISTRATION);
-			return Flows.forms(session, realm, client, uriInfo).setError(error).setFormData(formData)
-					.setClientSessionCode(clientCode.getCode()).createRegistration();
-		}
-
-		// Validate that user with this username doesn't exist in realm or any federation provider
-		if (session.users().getUserByUsername(username, realm) != null) {
-			event.error(Errors.USERNAME_IN_USE);
-			return Flows.forms(session, realm, client, uriInfo).setError(Messages.USERNAME_EXISTS).setFormData(formData)
-					.setClientSessionCode(clientCode.getCode()).createRegistration();
-		}
-
-		// Validate that user with this email doesn't exist in realm or any federation provider
-		if (session.users().getUserByEmail(email, realm) != null) {
-			event.error(Errors.EMAIL_IN_USE);
-			return Flows.forms(session, realm, client, uriInfo).setError(Messages.EMAIL_EXISTS).setFormData(formData)
-					.setClientSessionCode(clientCode.getCode()).createRegistration();
-		}
-
-		UserModel user = session.users().addUser(realm, username);
-		user.setEnabled(true);
-		user.setFirstName(formData.getFirst("firstName"));
-		user.setLastName(formData.getFirst("lastName"));
-
-		user.setEmail(email);
-
-		if (requiredCredentialTypes.contains(CredentialRepresentation.PASSWORD)) {
-			UserCredentialModel credentials = new UserCredentialModel();
-			credentials.setType(CredentialRepresentation.PASSWORD);
-			credentials.setValue(formData.getFirst("password"));
-
-			boolean passwordUpdateSuccessful;
-			String passwordUpdateError = null;
-			try {
-				session.users().updateCredential(realm, user, UserCredentialModel.password(formData.getFirst("password")));
-				passwordUpdateSuccessful = true;
-			} catch (Exception ape) {
-				passwordUpdateSuccessful = false;
-				passwordUpdateError = ape.getMessage();
-			}
-
-			// User already registered, but force him to update password
-			if (!passwordUpdateSuccessful) {
-				user.addRequiredAction(UserModel.RequiredAction.UPDATE_PASSWORD);
-				return Flows.forms(session, realm, client, uriInfo).setError(passwordUpdateError)
-						.setClientSessionCode(clientCode.getCode()).createResponse(UserModel.RequiredAction.UPDATE_PASSWORD);
-			}
-		}
-
-		AttributeFormDataProcessor.process(formData, realm, user);
-
-		event.user(user).success();
-		event.reset();
-
-		return processLogin(code, formData);
-	}
-
-	/**
-	 * OAuth grant page. You should not invoked this directly!
-	 * 
-	 * @param formData
-	 * @return
-	 */
-	@Path("consent")
-	@POST
-	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-	public Response processConsent(final MultivaluedMap<String, String> formData) {
-		event.event(EventType.LOGIN).detail(Details.RESPONSE_TYPE, "code");
-
-		if (!checkSsl()) {
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
-		}
-
-		String code = formData.getFirst("code");
-
-		ClientSessionCode accessCode = ClientSessionCode.parse(code, session, realm);
-		if (accessCode == null || !accessCode.isValid(ClientSessionModel.Action.OAUTH_GRANT)) {
-			event.error(Errors.INVALID_CODE);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Invalid access code.");
-		}
-		ClientSessionModel clientSession = accessCode.getClientSession();
-		event.detail(Details.CODE_ID, clientSession.getId());
-
-		String redirect = clientSession.getRedirectUri();
-
-		event.client(clientSession.getClient()).user(clientSession.getUserSession().getUser())
-				.detail(Details.RESPONSE_TYPE, "code").detail(Details.REDIRECT_URI, redirect);
-
-		UserSessionModel userSession = clientSession.getUserSession();
-		if (userSession != null) {
-			event.detail(Details.AUTH_METHOD, userSession.getAuthMethod());
-			event.detail(Details.USERNAME, userSession.getLoginUsername());
-			if (userSession.isRememberMe()) {
-				event.detail(Details.REMEMBER_ME, "true");
-			}
-		}
-
-		if (!AuthenticationManager.isSessionValid(realm, userSession)) {
-			AuthenticationManager.logout(session, realm, userSession, uriInfo, clientConnection);
-			event.error(Errors.INVALID_CODE);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Session not active");
-		}
-		event.session(userSession);
-
-		LoginProtocol protocol = session.getProvider(LoginProtocol.class, clientSession.getAuthMethod());
-		protocol.setRealm(realm).setUriInfo(uriInfo);
-		if (formData.containsKey("cancel")) {
-			event.error(Errors.REJECTED_BY_USER);
-			return protocol.consentDenied(clientSession);
-		}
-
-		event.success();
-
-		return authManager.redirectAfterSuccessfulFlow(session, realm, userSession, clientSession, request, uriInfo,
-				clientConnection);
-	}
-
-	@Path("profile")
-	@POST
-	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-	public Response updateProfile(@QueryParam("code") String code, final MultivaluedMap<String, String> formData) {
-		event.event(EventType.UPDATE_PROFILE);
-		Checks checks = new Checks();
-		if (!checks.check(code, ClientSessionModel.Action.UPDATE_PROFILE)) {
-			return checks.response;
-		}
-		ClientSessionCode accessCode = checks.clientCode;
-		ClientSessionModel clientSession = accessCode.getClientSession();
-		UserSessionModel userSession = clientSession.getUserSession();
-		UserModel user = userSession.getUser();
-
-		initEvent(clientSession);
-
-		String error = Validation.validateUpdateProfileForm(formData);
-		if (error != null) {
-			return Flows.forms(session, realm, null, uriInfo).setUser(user).setError(error)
-					.setClientSessionCode(accessCode.getCode()).createResponse(RequiredAction.UPDATE_PROFILE);
-		}
-
-		user.setFirstName(formData.getFirst("firstName"));
-		user.setLastName(formData.getFirst("lastName"));
-
-		String email = formData.getFirst("email");
-
-		String oldEmail = user.getEmail();
-		boolean emailChanged = oldEmail != null ? !oldEmail.equals(email) : email != null;
-
-		if (emailChanged) {
-			UserModel userByEmail = session.users().getUserByEmail(email, realm);
-
-			// check for duplicated email
-			if (userByEmail != null && !userByEmail.getId().equals(user.getId())) {
-				return Flows.forms(session, realm, null, uriInfo).setUser(user).setError(Messages.EMAIL_EXISTS)
-						.setClientSessionCode(accessCode.getCode()).createResponse(RequiredAction.UPDATE_PROFILE);
-			}
-
-			user.setEmail(email);
-			user.setEmailVerified(false);
-		}
-
-		user.removeRequiredAction(RequiredAction.UPDATE_PROFILE);
-		event.clone().event(EventType.UPDATE_PROFILE).success();
-
-		if (emailChanged) {
-			event.clone().event(EventType.UPDATE_EMAIL).detail(Details.PREVIOUS_EMAIL, oldEmail)
-					.detail(Details.UPDATED_EMAIL, email).success();
-		}
-
-		return redirectOauth(user, accessCode, clientSession, userSession);
-	}
-
-	@Path("totp")
-	@POST
-	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-	public Response updateTotp(@QueryParam("code") String code, final MultivaluedMap<String, String> formData) {
-		event.event(EventType.UPDATE_TOTP);
-		Checks checks = new Checks();
-		if (!checks.check(code, ClientSessionModel.Action.CONFIGURE_TOTP)) {
-			return checks.response;
-		}
-		ClientSessionCode accessCode = checks.clientCode;
-		ClientSessionModel clientSession = accessCode.getClientSession();
-		UserSessionModel userSession = clientSession.getUserSession();
-		UserModel user = userSession.getUser();
-
-		initEvent(clientSession);
-
-		String totp = formData.getFirst("totp");
-		String totpSecret = formData.getFirst("totpSecret");
-
-		LoginFormsProvider loginForms = Flows.forms(session, realm, null, uriInfo).setUser(user);
-		if (Validation.isEmpty(totp)) {
-			return loginForms.setError(Messages.MISSING_TOTP).setClientSessionCode(accessCode.getCode())
-					.createResponse(RequiredAction.CONFIGURE_TOTP);
-		} else if (!new TimeBasedOTP().validate(totp, totpSecret.getBytes())) {
-			return loginForms.setError(Messages.INVALID_TOTP).setClientSessionCode(accessCode.getCode())
-					.createResponse(RequiredAction.CONFIGURE_TOTP);
-		}
-
-		UserCredentialModel credentials = new UserCredentialModel();
-		credentials.setType(CredentialRepresentation.TOTP);
-		credentials.setValue(totpSecret);
-		session.users().updateCredential(realm, user, credentials);
-
-		user.setTotp(true);
-
-		user.removeRequiredAction(RequiredAction.CONFIGURE_TOTP);
-
-		event.clone().event(EventType.UPDATE_TOTP).success();
-
-		return redirectOauth(user, accessCode, clientSession, userSession);
-	}
-
-	@Path("password")
-	@POST
-	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-	public Response updatePassword(@QueryParam("code") String code, final MultivaluedMap<String, String> formData) {
-		event.event(EventType.UPDATE_PASSWORD);
-		Checks checks = new Checks();
-		if (!checks.check(code, ClientSessionModel.Action.UPDATE_PASSWORD, ClientSessionModel.Action.RECOVER_PASSWORD)) {
-			return checks.response;
-		}
-		ClientSessionCode accessCode = checks.clientCode;
-		ClientSessionModel clientSession = accessCode.getClientSession();
-		UserSessionModel userSession = clientSession.getUserSession();
-		UserModel user = userSession.getUser();
-
-		initEvent(clientSession);
-
-		String passwordNew = formData.getFirst("password-new");
-		String passwordConfirm = formData.getFirst("password-confirm");
-
-		LoginFormsProvider loginForms = Flows.forms(session, realm, null, uriInfo).setUser(user);
-		if (Validation.isEmpty(passwordNew)) {
-			return loginForms.setError(Messages.MISSING_PASSWORD).setClientSessionCode(accessCode.getCode())
-					.createResponse(RequiredAction.UPDATE_PASSWORD);
-		} else if (!passwordNew.equals(passwordConfirm)) {
-			return loginForms.setError(Messages.NOTMATCH_PASSWORD).setClientSessionCode(accessCode.getCode())
-					.createResponse(RequiredAction.UPDATE_PASSWORD);
-		}
-
-		try {
-			session.users().updateCredential(realm, user, UserCredentialModel.password(passwordNew));
-		} catch (Exception ape) {
-			return loginForms.setError(ape.getMessage()).setClientSessionCode(accessCode.getCode())
-					.createResponse(RequiredAction.UPDATE_PASSWORD);
-		}
-
-		user.removeRequiredAction(RequiredAction.UPDATE_PASSWORD);
-
-		event.event(EventType.UPDATE_PASSWORD).success();
-
-		if (clientSession.getAction().equals(ClientSessionModel.Action.RECOVER_PASSWORD)) {
-			String actionCookieValue = getActionCookie();
-			if (actionCookieValue == null || !actionCookieValue.equals(userSession.getId())) {
-				return Flows.forms(session, realm, clientSession.getClient(), uriInfo).setSuccess("passwordUpdated")
-						.createInfoPage();
-			}
-		}
-
-		event = event.clone().event(EventType.LOGIN);
-
-		return redirectOauth(user, accessCode, clientSession, userSession);
-	}
-
-	@Path("email-verification")
-	@GET
-	public Response emailVerification(@QueryParam("code") String code, @QueryParam("key") String key) {
-		event.event(EventType.VERIFY_EMAIL);
-		if (key != null) {
-			Checks checks = new Checks();
-			if (!checks.check(key, ClientSessionModel.Action.VERIFY_EMAIL)) {
-				return checks.response;
-			}
-			ClientSessionCode accessCode = checks.clientCode;
-			ClientSessionModel clientSession = accessCode.getClientSession();
-			UserSessionModel userSession = clientSession.getUserSession();
-			UserModel user = userSession.getUser();
-			initEvent(clientSession);
-			user.setEmailVerified(true);
-
-			user.removeRequiredAction(RequiredAction.VERIFY_EMAIL);
-
-			event.event(EventType.VERIFY_EMAIL).detail(Details.EMAIL, user.getEmail()).success();
-
-			String actionCookieValue = getActionCookie();
-			if (actionCookieValue == null || !actionCookieValue.equals(userSession.getId())) {
-				return Flows.forms(session, realm, clientSession.getClient(), uriInfo).setSuccess("emailVerified")
-						.createInfoPage();
-			}
-
-			event = event.clone().removeDetail(Details.EMAIL).event(EventType.LOGIN);
-
-			return redirectOauth(user, accessCode, clientSession, userSession);
-		} else {
-			Checks checks = new Checks();
-			if (!checks.check(code, ClientSessionModel.Action.VERIFY_EMAIL)) {
-				return checks.response;
-			}
-			ClientSessionCode accessCode = checks.clientCode;
-			ClientSessionModel clientSession = accessCode.getClientSession();
-			UserSessionModel userSession = clientSession.getUserSession();
-			initEvent(clientSession);
-
-			createActionCookie(realm, uriInfo, clientConnection, userSession.getId());
-
-			return Flows.forms(session, realm, null, uriInfo).setClientSessionCode(accessCode.getCode())
-					.setUser(userSession.getUser()).createResponse(RequiredAction.VERIFY_EMAIL);
-		}
-	}
-
-	@Path("password-reset")
-	@GET
-	public Response passwordReset(@QueryParam("code") String code, @QueryParam("key") String key) {
-		event.event(EventType.RESET_PASSWORD);
-		if (key != null) {
-			Checks checks = new Checks();
-			if (!checks.check(key, ClientSessionModel.Action.RECOVER_PASSWORD)) {
-				return checks.response;
-			}
-			ClientSessionCode accessCode = checks.clientCode;
-			return Flows.forms(session, realm, null, uriInfo).setClientSessionCode(accessCode.getCode())
-					.createResponse(RequiredAction.UPDATE_PASSWORD);
-		} else {
-			return Flows.forms(session, realm, null, uriInfo).setClientSessionCode(code).createPasswordReset();
-		}
-	}
-
-	@Path("password-reset")
-	@POST
-	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-	public Response sendPasswordReset(@QueryParam("code") String code, final MultivaluedMap<String, String> formData) {
-		event.event(EventType.SEND_RESET_PASSWORD);
-		if (!checkSsl()) {
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
-		}
-		if (!realm.isEnabled()) {
-			event.error(Errors.REALM_DISABLED);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled.");
-		}
-		ClientSessionCode accessCode = ClientSessionCode.parse(code, session, realm);
-		if (accessCode == null) {
-			event.error(Errors.INVALID_CODE);
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
-					"Unknown code, please login again through your application.");
-		}
-		ClientSessionModel clientSession = accessCode.getClientSession();
-
-		String username = formData.getFirst("username");
-
-		ClientModel client = clientSession.getClient();
-		if (client == null) {
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown login requester.");
-		}
-		if (!client.isEnabled()) {
-			return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Login requester not enabled.");
-		}
-
-		event.client(client.getClientId()).detail(Details.REDIRECT_URI, clientSession.getRedirectUri())
-				.detail(Details.RESPONSE_TYPE, "code").detail(Details.AUTH_METHOD, "form").detail(Details.USERNAME, username);
-
-		UserModel user = session.users().getUserByUsername(username, realm);
-		if (user == null && username.contains("@")) {
-			user = session.users().getUserByEmail(username, realm);
-		}
-
-		if (user == null) {
-			event.error(Errors.USER_NOT_FOUND);
-		} else if (!user.isEnabled()) {
-			event.user(user).error(Errors.USER_DISABLED);
-		} else if (user.getEmail() == null || user.getEmail().trim().length() == 0) {
-			event.user(user).error(Errors.INVALID_EMAIL);
-		} else {
-			event.user(user);
-
-			UserSessionModel userSession = session.sessions().createUserSession(realm, user, username,
-					clientConnection.getRemoteAddr(), "form", false);
-			event.session(userSession);
-			TokenManager.attachClientSession(userSession, clientSession);
-
-			accessCode.setAction(ClientSessionModel.Action.RECOVER_PASSWORD);
-
-			try {
-				UriBuilder builder = Urls.loginPasswordResetBuilder(uriInfo.getBaseUri());
-				builder.queryParam("key", accessCode.getCode());
-
-				String link = builder.build(realm.getName()).toString();
-				long expiration = TimeUnit.SECONDS.toMinutes(realm.getAccessCodeLifespanUserAction());
-
-				this.session.getProvider(EmailProvider.class).setRealm(realm).setUser(user).sendPasswordReset(link, expiration);
-
-				event.detail(Details.EMAIL, user.getEmail()).detail(Details.CODE_ID, clientSession.getId()).success();
-			} catch (EmailException e) {
-				event.error(Errors.EMAIL_SEND_FAILED);
-				logger.error("Failed to send password reset email", e);
-				return Flows.forms(this.session, realm, client, uriInfo).setError("emailSendError")
-						.setClientSessionCode(accessCode.getCode()).createErrorPage();
-			}
-
-			createActionCookie(realm, uriInfo, clientConnection, userSession.getId());
-		}
-
-		return Flows.forms(session, realm, client, uriInfo).setSuccess("emailSent")
-				.setClientSessionCode(accessCode.getCode()).createPasswordReset();
-	}
-
-	private String getActionCookie() {
-		Cookie cookie = headers.getCookies().get(ACTION_COOKIE);
-		AuthenticationManager.expireCookie(realm, ACTION_COOKIE, AuthenticationManager.getRealmCookiePath(realm, uriInfo),
-				realm.getSslRequired().isRequired(clientConnection), clientConnection);
-		return cookie != null ? cookie.getValue() : null;
-	}
-
-	public static void createActionCookie(RealmModel realm, UriInfo uriInfo, ClientConnection clientConnection,
-			String sessionId) {
-		CookieHelper.addCookie(ACTION_COOKIE, sessionId, AuthenticationManager.getRealmCookiePath(realm, uriInfo), null,
-				null, -1, realm.getSslRequired().isRequired(clientConnection), true);
-	}
-
-	private Response redirectOauth(UserModel user, ClientSessionCode accessCode, ClientSessionModel clientSession,
-			UserSessionModel userSession) {
-		return AuthenticationManager.nextActionAfterAuthentication(session, userSession, clientSession, clientConnection,
-				request, uriInfo, event);
-	}
-
-	private void initEvent(ClientSessionModel clientSession) {
-		event.event(EventType.LOGIN).client(clientSession.getClient()).user(clientSession.getUserSession().getUser())
-				.session(clientSession.getUserSession().getId()).detail(Details.CODE_ID, clientSession.getId())
-				.detail(Details.REDIRECT_URI, clientSession.getRedirectUri()).detail(Details.RESPONSE_TYPE, "code");
-
-		UserSessionModel userSession = clientSession.getUserSession();
-
-		if (userSession != null) {
-			event.detail(Details.AUTH_METHOD, userSession.getAuthMethod());
-			event.detail(Details.USERNAME, userSession.getLoginUsername());
-			if (userSession.isRememberMe()) {
-				event.detail(Details.REMEMBER_ME, "true");
-			}
-		}
-	}
+    protected static final Logger logger = Logger.getLogger(LoginActionsService.class);
+
+    public static final String ACTION_COOKIE = "KEYCLOAK_ACTION";
+
+    private RealmModel realm;
+
+    @Context
+    private HttpRequest request;
+
+    @Context
+    protected HttpHeaders headers;
+
+    @Context
+    private UriInfo uriInfo;
+
+    @Context
+    private ClientConnection clientConnection;
+
+    @Context
+    protected Providers providers;
+
+    @Context
+    protected KeycloakSession session;
+
+    private AuthenticationManager authManager;
+
+    private EventBuilder event;
+
+    public static UriBuilder loginActionsBaseUrl(UriInfo uriInfo) {
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return loginActionsBaseUrl(baseUriBuilder);
+    }
+
+    public static UriBuilder loginActionsBaseUrl(UriBuilder baseUriBuilder) {
+        return baseUriBuilder.path(RealmsResource.class).path(RealmsResource.class, "getLoginActionsService");
+    }
+
+    public static UriBuilder processLoginUrl(UriInfo uriInfo) {
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return processLoginUrl(baseUriBuilder);
+    }
+
+    public static UriBuilder processLoginUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = loginActionsBaseUrl(baseUriBuilder);
+        return uriBuilder.path(OIDCLoginProtocolService.class, "processLogin");
+    }
+
+    public static UriBuilder processOAuthUrl(UriInfo uriInfo) {
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return processOAuthUrl(baseUriBuilder);
+    }
+
+    public static UriBuilder processOAuthUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = loginActionsBaseUrl(baseUriBuilder);
+        return uriBuilder.path(OIDCLoginProtocolService.class, "processOAuth");
+    }
+
+    public LoginActionsService(RealmModel realm, AuthenticationManager authManager, EventBuilder event) {
+        this.realm = realm;
+        this.authManager = authManager;
+        this.event = event;
+    }
+
+    private boolean checkSsl() {
+        if (uriInfo.getBaseUri().getScheme().equals("https")) {
+            return true;
+        } else {
+            return !realm.getSslRequired().isRequired(clientConnection);
+        }
+    }
+
+    private class Checks {
+        ClientSessionCode clientCode;
+        Response response;
+
+        boolean check(String code, ClientSessionModel.Action requiredAction) {
+            if (!check(code)) {
+                return false;
+            } else if (!clientCode.isValid(requiredAction)) {
+                event.error(Errors.INVALID_CODE);
+                response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Invalid code, please login again through your application.");
+                return false;
+            } else {
+                return true;
+            }
+        }
+
+        boolean check(String code, ClientSessionModel.Action requiredAction, ClientSessionModel.Action alternativeRequiredAction) {
+            if (!check(code)) {
+                return false;
+            } else if (!(clientCode.isValid(requiredAction) || clientCode.isValid(alternativeRequiredAction))) {
+                event.error(Errors.INVALID_CODE);
+                response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Invalid code, please login again through your application.");
+                return false;
+            } else {
+                return true;
+            }
+        }
+
+        public boolean check(String code) {
+            if (!checkSsl()) {
+                event.error(Errors.SSL_REQUIRED);
+                response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
+                return false;
+            }
+            if (!realm.isEnabled()) {
+                event.error(Errors.REALM_DISABLED);
+                response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled.");
+                return false;
+            }
+            clientCode = ClientSessionCode.parse(code, session, realm);
+            if (clientCode == null) {
+                event.error(Errors.INVALID_CODE);
+                response = Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown code, please login again through your application.");
+                return false;
+            }
+            return true;
+        }
+    }
+
+    /**
+     * protocol independent login page entry point
+     * 
+     * 
+     * @param code
+     * @return
+     */
+    @Path("login")
+    @GET
+    public Response loginPage(@QueryParam("code") String code) {
+        event.event(EventType.LOGIN);
+        Checks checks = new Checks();
+        if (!checks.check(code)) {
+            return checks.response;
+        }
+        event.detail(Details.CODE_ID, code);
+        ClientSessionCode clientSessionCode = checks.clientCode;
+        ClientSessionModel clientSession = clientSessionCode.getClientSession();
+
+        if (clientSession.getAction().equals(ClientSessionModel.Action.RECOVER_PASSWORD)) {
+            TokenManager.dettachClientSession(session.sessions(), realm, clientSession);
+            clientSession.setAction(ClientSessionModel.Action.AUTHENTICATE);
+        }
+
+        LoginFormsProvider forms = Flows.forms(session, realm, clientSession.getClient(), uriInfo)
+                .setClientSessionCode(clientSessionCode.getCode());
+
+        return forms.createLogin();
+    }
+
+    /**
+     * protocol independent registration page entry point
+     * 
+     * @param code
+     * @return
+     */
+    @Path("registration")
+    @GET
+    public Response registerPage(@QueryParam("code") String code) {
+        event.event(EventType.REGISTER);
+        if (!realm.isRegistrationAllowed()) {
+            event.error(Errors.REGISTRATION_DISABLED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Registration not allowed");
+        }
+
+        Checks checks = new Checks();
+        if (!checks.check(code)) {
+            return checks.response;
+        }
+        event.detail(Details.CODE_ID, code);
+        ClientSessionCode clientSessionCode = checks.clientCode;
+        ClientSessionModel clientSession = clientSessionCode.getClientSession();
+
+        authManager.expireIdentityCookie(realm, uriInfo, clientConnection);
+
+        return Flows.forms(session, realm, clientSession.getClient(), uriInfo)
+                .setClientSessionCode(clientSessionCode.getCode())
+                .createRegistration();
+    }
+
+    /**
+     * URL called after login page. YOU SHOULD NEVER INVOKE THIS DIRECTLY!
+     * 
+     * @param code
+     * @param formData
+     * @return
+     */
+    @Path("request/login")
+    @POST
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public Response processLogin(@QueryParam("code") String code,
+            final MultivaluedMap<String, String> formData) {
+        event.event(EventType.LOGIN);
+        if (!checkSsl()) {
+            event.error(Errors.SSL_REQUIRED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
+        }
+
+        if (!realm.isEnabled()) {
+            event.error(Errors.REALM_DISABLED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled.");
+        }
+        ClientSessionCode clientCode = ClientSessionCode.parse(code, session, realm);
+        if (clientCode == null) {
+            event.error(Errors.INVALID_CODE);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown code, please login again through your application.");
+        }
+
+        ClientSessionModel clientSession = clientCode.getClientSession();
+        event.detail(Details.CODE_ID, clientSession.getId());
+
+        if (!clientCode.isValid(ClientSessionModel.Action.AUTHENTICATE) || clientSession.getUserSession() != null) {
+            clientCode.setAction(ClientSessionModel.Action.AUTHENTICATE);
+            event.client(clientSession.getClient()).error(Errors.EXPIRED_CODE);
+            return Flows.forms(this.session, realm, clientSession.getClient(), uriInfo).setError(Messages.EXPIRED_CODE)
+                    .setClientSessionCode(clientCode.getCode())
+                    .createLogin();
+        }
+
+        String username = formData.getFirst(AuthenticationManager.FORM_USERNAME);
+
+        String rememberMe = formData.getFirst("rememberMe");
+        boolean remember = rememberMe != null && rememberMe.equalsIgnoreCase("on");
+
+        event.client(clientSession.getClient().getClientId())
+                .detail(Details.REDIRECT_URI, clientSession.getRedirectUri())
+                .detail(Details.RESPONSE_TYPE, "code")
+                .detail(Details.AUTH_METHOD, "form")
+                .detail(Details.USERNAME, username);
+
+        if (remember) {
+            event.detail(Details.REMEMBER_ME, "true");
+        }
+
+        ClientModel client = clientSession.getClient();
+        if (client == null) {
+            event.error(Errors.CLIENT_NOT_FOUND);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown login requester.");
+        }
+        if (!client.isEnabled()) {
+            event.error(Errors.CLIENT_NOT_FOUND);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Login requester not enabled.");
+        }
+
+        if (formData.containsKey("cancel")) {
+            event.error(Errors.REJECTED_BY_USER);
+            LoginProtocol protocol = session.getProvider(LoginProtocol.class, clientSession.getAuthMethod());
+            protocol.setRealm(realm)
+                    .setUriInfo(uriInfo);
+            return protocol.cancelLogin(clientSession);
+        }
+
+        AuthenticationManager.AuthenticationStatus status = authManager.authenticateForm(session, clientConnection, realm, formData);
+
+        if (remember) {
+            authManager.createRememberMeCookie(realm, username, uriInfo, clientConnection);
+        } else {
+            authManager.expireRememberMeCookie(realm, uriInfo, clientConnection);
+        }
+
+        UserModel user = KeycloakModelUtils.findUserByNameOrEmail(session, realm, username);
+        if (user != null) {
+            event.user(user);
+        }
+
+        switch (status) {
+            case SUCCESS:
+            case ACTIONS_REQUIRED:
+                UserSessionModel userSession = session.sessions().createUserSession(realm, user, username, clientConnection.getRemoteAddr(), "form", remember);
+                TokenManager.attachClientSession(userSession, clientSession);
+                event.session(userSession);
+                return authManager.nextActionAfterAuthentication(session, userSession, clientSession, clientConnection, request, uriInfo, event);
+            case ACCOUNT_TEMPORARILY_DISABLED:
+                event.error(Errors.USER_TEMPORARILY_DISABLED);
+                return Flows.forms(this.session, realm, client, uriInfo)
+                        .setError(Messages.ACCOUNT_TEMPORARILY_DISABLED)
+                        .setFormData(formData)
+                        .setClientSessionCode(clientCode.getCode())
+                        .createLogin();
+            case ACCOUNT_DISABLED:
+                event.error(Errors.USER_DISABLED);
+                return Flows.forms(this.session, realm, client, uriInfo)
+                        .setError(Messages.ACCOUNT_DISABLED)
+                        .setClientSessionCode(clientCode.getCode())
+                        .setFormData(formData).createLogin();
+            case MISSING_TOTP:
+                formData.remove(CredentialRepresentation.PASSWORD);
+
+                String passwordToken = new JWSBuilder().jsonContent(new PasswordToken(realm.getName(), user.getId())).rsa256(realm.getPrivateKey());
+                formData.add(CredentialRepresentation.PASSWORD_TOKEN, passwordToken);
+
+                return Flows.forms(this.session, realm, client, uriInfo)
+                        .setFormData(formData)
+                        .setClientSessionCode(clientCode.getCode())
+                        .createLoginTotp();
+            case INVALID_USER:
+                event.error(Errors.USER_NOT_FOUND);
+                return Flows.forms(this.session, realm, client, uriInfo).setError(Messages.INVALID_USER)
+                        .setFormData(formData)
+                        .setClientSessionCode(clientCode.getCode())
+                        .createLogin();
+            default:
+                event.error(Errors.INVALID_USER_CREDENTIALS);
+                return Flows.forms(this.session, realm, client, uriInfo).setError(Messages.INVALID_USER)
+                        .setFormData(formData)
+                        .setClientSessionCode(clientCode.getCode())
+                        .createLogin();
+        }
+    }
+
+    /**
+     * Registration
+     * 
+     * @param code
+     * @param formData
+     * @return
+     */
+    @Path("request/registration")
+    @POST
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public Response processRegister(@QueryParam("code") String code,
+            final MultivaluedMap<String, String> formData) {
+        event.event(EventType.REGISTER);
+        if (!checkSsl()) {
+            event.error(Errors.SSL_REQUIRED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
+        }
+
+        if (!realm.isEnabled()) {
+            event.error(Errors.REALM_DISABLED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled.");
+        }
+        if (!realm.isRegistrationAllowed()) {
+            event.error(Errors.REGISTRATION_DISABLED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Registration not allowed");
+        }
+        ClientSessionCode clientCode = ClientSessionCode.parse(code, session, realm);
+        if (clientCode == null) {
+            event.error(Errors.INVALID_CODE);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown code, please login again through your application.");
+        }
+        if (!clientCode.isValid(ClientSessionModel.Action.AUTHENTICATE)) {
+            event.error(Errors.INVALID_CODE);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Invalid code, please login again through your application.");
+        }
+
+        String username = formData.getFirst("username");
+        String email = formData.getFirst("email");
+        if (realm.isRegistrationEmailAsUsername()) {
+            username = email;
+            formData.putSingle(AuthenticationManager.FORM_USERNAME, username);
+        }
+        ClientSessionModel clientSession = clientCode.getClientSession();
+        event.client(clientSession.getClient())
+                .detail(Details.REDIRECT_URI, clientSession.getRedirectUri())
+                .detail(Details.RESPONSE_TYPE, "code")
+                .detail(Details.USERNAME, username)
+                .detail(Details.EMAIL, email)
+                .detail(Details.REGISTER_METHOD, "form");
+
+        if (!realm.isEnabled()) {
+            event.error(Errors.REALM_DISABLED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled");
+        }
+        ClientModel client = clientSession.getClient();
+        if (client == null) {
+            event.error(Errors.CLIENT_NOT_FOUND);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown login requester.");
+        }
+
+        if (!client.isEnabled()) {
+            event.error(Errors.CLIENT_DISABLED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Login requester not enabled.");
+        }
+
+        List<String> requiredCredentialTypes = new LinkedList<String>();
+        for (RequiredCredentialModel m : realm.getRequiredCredentials()) {
+            requiredCredentialTypes.add(m.getType());
+        }
+
+        // Validate here, so user is not created if password doesn't validate to passwordPolicy of current realm
+        String error = Validation.validateRegistrationForm(realm, formData, requiredCredentialTypes);
+        if (error == null) {
+            error = Validation.validatePassword(formData, realm.getPasswordPolicy());
+        }
+
+        if (error != null) {
+            event.error(Errors.INVALID_REGISTRATION);
+            return Flows.forms(session, realm, client, uriInfo)
+                    .setError(error)
+                    .setFormData(formData)
+                    .setClientSessionCode(clientCode.getCode())
+                    .createRegistration();
+        }
+
+        // Validate that user with this username doesn't exist in realm or any federation provider
+        if (session.users().getUserByUsername(username, realm) != null) {
+            event.error(Errors.USERNAME_IN_USE);
+            return Flows.forms(session, realm, client, uriInfo)
+                    .setError(Messages.USERNAME_EXISTS)
+                    .setFormData(formData)
+                    .setClientSessionCode(clientCode.getCode())
+                    .createRegistration();
+        }
+
+        // Validate that user with this email doesn't exist in realm or any federation provider
+        if (session.users().getUserByEmail(email, realm) != null) {
+            event.error(Errors.EMAIL_IN_USE);
+            return Flows.forms(session, realm, client, uriInfo)
+                    .setError(Messages.EMAIL_EXISTS)
+                    .setFormData(formData)
+                    .setClientSessionCode(clientCode.getCode())
+                    .createRegistration();
+        }
+
+        UserModel user = session.users().addUser(realm, username);
+        user.setEnabled(true);
+        user.setFirstName(formData.getFirst("firstName"));
+        user.setLastName(formData.getFirst("lastName"));
+
+        user.setEmail(email);
+
+        if (requiredCredentialTypes.contains(CredentialRepresentation.PASSWORD)) {
+            UserCredentialModel credentials = new UserCredentialModel();
+            credentials.setType(CredentialRepresentation.PASSWORD);
+            credentials.setValue(formData.getFirst("password"));
+
+            boolean passwordUpdateSuccessful;
+            String passwordUpdateError = null;
+            try {
+                session.users().updateCredential(realm, user, UserCredentialModel.password(formData.getFirst("password")));
+                passwordUpdateSuccessful = true;
+            } catch (Exception ape) {
+                passwordUpdateSuccessful = false;
+                passwordUpdateError = ape.getMessage();
+            }
+
+            // User already registered, but force him to update password
+            if (!passwordUpdateSuccessful) {
+                user.addRequiredAction(UserModel.RequiredAction.UPDATE_PASSWORD);
+                return Flows.forms(session, realm, client, uriInfo)
+                        .setError(passwordUpdateError)
+                        .setClientSessionCode(clientCode.getCode())
+                        .createResponse(UserModel.RequiredAction.UPDATE_PASSWORD);
+            }
+        }
+
+        AttributeFormDataProcessor.process(formData, realm, user);
+
+        event.user(user).success();
+        event.reset();
+
+        return processLogin(code, formData);
+    }
+
+    /**
+     * OAuth grant page. You should not invoked this directly!
+     * 
+     * @param formData
+     * @return
+     */
+    @Path("consent")
+    @POST
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public Response processConsent(final MultivaluedMap<String, String> formData) {
+        event.event(EventType.LOGIN).detail(Details.RESPONSE_TYPE, "code");
+
+        if (!checkSsl()) {
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
+        }
+
+        String code = formData.getFirst("code");
+
+        ClientSessionCode accessCode = ClientSessionCode.parse(code, session, realm);
+        if (accessCode == null || !accessCode.isValid(ClientSessionModel.Action.OAUTH_GRANT)) {
+            event.error(Errors.INVALID_CODE);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Invalid access code.");
+        }
+        ClientSessionModel clientSession = accessCode.getClientSession();
+        event.detail(Details.CODE_ID, clientSession.getId());
+
+        String redirect = clientSession.getRedirectUri();
+
+        event.client(clientSession.getClient())
+                .user(clientSession.getUserSession().getUser())
+                .detail(Details.RESPONSE_TYPE, "code")
+                .detail(Details.REDIRECT_URI, redirect);
+
+        UserSessionModel userSession = clientSession.getUserSession();
+        if (userSession != null) {
+            event.detail(Details.AUTH_METHOD, userSession.getAuthMethod());
+            event.detail(Details.USERNAME, userSession.getLoginUsername());
+            if (userSession.isRememberMe()) {
+                event.detail(Details.REMEMBER_ME, "true");
+            }
+        }
+
+        if (!AuthenticationManager.isSessionValid(realm, userSession)) {
+            AuthenticationManager.logout(session, realm, userSession, uriInfo, clientConnection);
+            event.error(Errors.INVALID_CODE);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Session not active");
+        }
+        event.session(userSession);
+
+        LoginProtocol protocol = session.getProvider(LoginProtocol.class, clientSession.getAuthMethod());
+        protocol.setRealm(realm)
+                .setUriInfo(uriInfo);
+        if (formData.containsKey("cancel")) {
+            event.error(Errors.REJECTED_BY_USER);
+            return protocol.consentDenied(clientSession);
+        }
+
+        event.success();
+
+        return authManager.redirectAfterSuccessfulFlow(session, realm, userSession, clientSession, request, uriInfo, clientConnection);
+    }
+
+    @Path("profile")
+    @POST
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public Response updateProfile(@QueryParam("code") String code,
+            final MultivaluedMap<String, String> formData) {
+        event.event(EventType.UPDATE_PROFILE);
+        Checks checks = new Checks();
+        if (!checks.check(code, ClientSessionModel.Action.UPDATE_PROFILE)) {
+            return checks.response;
+        }
+        ClientSessionCode accessCode = checks.clientCode;
+        ClientSessionModel clientSession = accessCode.getClientSession();
+        UserSessionModel userSession = clientSession.getUserSession();
+        UserModel user = userSession.getUser();
+
+        initEvent(clientSession);
+
+        String error = Validation.validateUpdateProfileForm(formData);
+        if (error != null) {
+            return Flows.forms(session, realm, null, uriInfo).setUser(user).setError(error)
+                    .setClientSessionCode(accessCode.getCode())
+                    .createResponse(RequiredAction.UPDATE_PROFILE);
+        }
+
+        user.setFirstName(formData.getFirst("firstName"));
+        user.setLastName(formData.getFirst("lastName"));
+
+        String email = formData.getFirst("email");
+
+        String oldEmail = user.getEmail();
+        boolean emailChanged = oldEmail != null ? !oldEmail.equals(email) : email != null;
+
+        if (emailChanged) {
+            UserModel userByEmail = session.users().getUserByEmail(email, realm);
+
+            // check for duplicated email
+            if (userByEmail != null && !userByEmail.getId().equals(user.getId())) {
+                return Flows.forms(session, realm, null, uriInfo).setUser(user).setError(Messages.EMAIL_EXISTS)
+                        .setClientSessionCode(accessCode.getCode())
+                        .createResponse(RequiredAction.UPDATE_PROFILE);
+            }
+
+            user.setEmail(email);
+            user.setEmailVerified(false);
+        }
+
+        user.removeRequiredAction(RequiredAction.UPDATE_PROFILE);
+        event.clone().event(EventType.UPDATE_PROFILE).success();
+
+        if (emailChanged) {
+            event.clone().event(EventType.UPDATE_EMAIL).detail(Details.PREVIOUS_EMAIL, oldEmail).detail(Details.UPDATED_EMAIL, email).success();
+        }
+
+        return redirectOauth(user, accessCode, clientSession, userSession);
+    }
+
+    @Path("totp")
+    @POST
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public Response updateTotp(@QueryParam("code") String code,
+            final MultivaluedMap<String, String> formData) {
+        event.event(EventType.UPDATE_TOTP);
+        Checks checks = new Checks();
+        if (!checks.check(code, ClientSessionModel.Action.CONFIGURE_TOTP)) {
+            return checks.response;
+        }
+        ClientSessionCode accessCode = checks.clientCode;
+        ClientSessionModel clientSession = accessCode.getClientSession();
+        UserSessionModel userSession = clientSession.getUserSession();
+        UserModel user = userSession.getUser();
+
+        initEvent(clientSession);
+
+        String totp = formData.getFirst("totp");
+        String totpSecret = formData.getFirst("totpSecret");
+
+        LoginFormsProvider loginForms = Flows.forms(session, realm, null, uriInfo).setUser(user);
+        if (Validation.isEmpty(totp)) {
+            return loginForms.setError(Messages.MISSING_TOTP)
+                    .setClientSessionCode(accessCode.getCode())
+                    .createResponse(RequiredAction.CONFIGURE_TOTP);
+        } else if (!new TimeBasedOTP().validate(totp, totpSecret.getBytes())) {
+            return loginForms.setError(Messages.INVALID_TOTP)
+                    .setClientSessionCode(accessCode.getCode())
+                    .createResponse(RequiredAction.CONFIGURE_TOTP);
+        }
+
+        UserCredentialModel credentials = new UserCredentialModel();
+        credentials.setType(CredentialRepresentation.TOTP);
+        credentials.setValue(totpSecret);
+        session.users().updateCredential(realm, user, credentials);
+
+        user.setTotp(true);
+
+        user.removeRequiredAction(RequiredAction.CONFIGURE_TOTP);
+
+        event.clone().event(EventType.UPDATE_TOTP).success();
+
+        return redirectOauth(user, accessCode, clientSession, userSession);
+    }
+
+    @Path("password")
+    @POST
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public Response updatePassword(@QueryParam("code") String code, final MultivaluedMap<String, String> formData) {
+        event.event(EventType.UPDATE_PASSWORD);
+        Checks checks = new Checks();
+        if (!checks.check(code, ClientSessionModel.Action.UPDATE_PASSWORD, ClientSessionModel.Action.RECOVER_PASSWORD)) {
+            return checks.response;
+        }
+        ClientSessionCode accessCode = checks.clientCode;
+        ClientSessionModel clientSession = accessCode.getClientSession();
+        UserSessionModel userSession = clientSession.getUserSession();
+        UserModel user = userSession.getUser();
+
+        initEvent(clientSession);
+
+        String passwordNew = formData.getFirst("password-new");
+        String passwordConfirm = formData.getFirst("password-confirm");
+
+        LoginFormsProvider loginForms = Flows.forms(session, realm, null, uriInfo).setUser(user);
+        if (Validation.isEmpty(passwordNew)) {
+            return loginForms.setError(Messages.MISSING_PASSWORD)
+                    .setClientSessionCode(accessCode.getCode())
+                    .createResponse(RequiredAction.UPDATE_PASSWORD);
+        } else if (!passwordNew.equals(passwordConfirm)) {
+            return loginForms.setError(Messages.NOTMATCH_PASSWORD)
+                    .setClientSessionCode(accessCode.getCode())
+                    .createResponse(RequiredAction.UPDATE_PASSWORD);
+        }
+
+        try {
+            session.users().updateCredential(realm, user, UserCredentialModel.password(passwordNew));
+        } catch (Exception ape) {
+            return loginForms.setError(ape.getMessage())
+                    .setClientSessionCode(accessCode.getCode())
+                    .createResponse(RequiredAction.UPDATE_PASSWORD);
+        }
+
+        user.removeRequiredAction(RequiredAction.UPDATE_PASSWORD);
+
+        event.event(EventType.UPDATE_PASSWORD).success();
+
+        if (clientSession.getAction().equals(ClientSessionModel.Action.RECOVER_PASSWORD)) {
+            String actionCookieValue = getActionCookie();
+            if (actionCookieValue == null || !actionCookieValue.equals(userSession.getId())) {
+                return Flows.forms(session, realm, clientSession.getClient(), uriInfo).setSuccess("passwordUpdated").createInfoPage();
+            }
+        }
+
+        event = event.clone().event(EventType.LOGIN);
+
+        return redirectOauth(user, accessCode, clientSession, userSession);
+    }
+
+    @Path("email-verification")
+    @GET
+    public Response emailVerification(@QueryParam("code") String code, @QueryParam("key") String key) {
+        event.event(EventType.VERIFY_EMAIL);
+        if (key != null) {
+            Checks checks = new Checks();
+            if (!checks.check(key, ClientSessionModel.Action.VERIFY_EMAIL)) {
+                return checks.response;
+            }
+            ClientSessionCode accessCode = checks.clientCode;
+            ClientSessionModel clientSession = accessCode.getClientSession();
+            UserSessionModel userSession = clientSession.getUserSession();
+            UserModel user = userSession.getUser();
+            initEvent(clientSession);
+            user.setEmailVerified(true);
+
+            user.removeRequiredAction(RequiredAction.VERIFY_EMAIL);
+
+            event.event(EventType.VERIFY_EMAIL).detail(Details.EMAIL, user.getEmail()).success();
+
+            String actionCookieValue = getActionCookie();
+            if (actionCookieValue == null || !actionCookieValue.equals(userSession.getId())) {
+                return Flows.forms(session, realm, clientSession.getClient(), uriInfo).setSuccess("emailVerified").createInfoPage();
+            }
+
+            event = event.clone().removeDetail(Details.EMAIL).event(EventType.LOGIN);
+
+            return redirectOauth(user, accessCode, clientSession, userSession);
+        } else {
+            Checks checks = new Checks();
+            if (!checks.check(code, ClientSessionModel.Action.VERIFY_EMAIL)) {
+                return checks.response;
+            }
+            ClientSessionCode accessCode = checks.clientCode;
+            ClientSessionModel clientSession = accessCode.getClientSession();
+            UserSessionModel userSession = clientSession.getUserSession();
+            initEvent(clientSession);
+
+            createActionCookie(realm, uriInfo, clientConnection, userSession.getId());
+
+            return Flows.forms(session, realm, null, uriInfo)
+                    .setClientSessionCode(accessCode.getCode())
+                    .setUser(userSession.getUser())
+                    .createResponse(RequiredAction.VERIFY_EMAIL);
+        }
+    }
+
+    @Path("password-reset")
+    @GET
+    public Response passwordReset(@QueryParam("code") String code, @QueryParam("key") String key) {
+        event.event(EventType.RESET_PASSWORD);
+        if (key != null) {
+            Checks checks = new Checks();
+            if (!checks.check(key, ClientSessionModel.Action.RECOVER_PASSWORD)) {
+                return checks.response;
+            }
+            ClientSessionCode accessCode = checks.clientCode;
+            return Flows.forms(session, realm, null, uriInfo)
+                    .setClientSessionCode(accessCode.getCode())
+                    .createResponse(RequiredAction.UPDATE_PASSWORD);
+        } else {
+            return Flows.forms(session, realm, null, uriInfo)
+                    .setClientSessionCode(code)
+                    .createPasswordReset();
+        }
+    }
+
+    @Path("password-reset")
+    @POST
+    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    public Response sendPasswordReset(@QueryParam("code") String code, final MultivaluedMap<String, String> formData) {
+        event.event(EventType.SEND_RESET_PASSWORD);
+        if (!checkSsl()) {
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "HTTPS required");
+        }
+        if (!realm.isEnabled()) {
+            event.error(Errors.REALM_DISABLED);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Realm not enabled.");
+        }
+        ClientSessionCode accessCode = ClientSessionCode.parse(code, session, realm);
+        if (accessCode == null) {
+            event.error(Errors.INVALID_CODE);
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, "Unknown code, please login again through your application.");
+        }
+        ClientSessionModel clientSession = accessCode.getClientSession();
+
+        String username = formData.getFirst("username");
+
+        ClientModel client = clientSession.getClient();
+        if (client == null) {
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
+                    "Unknown login requester.");
+        }
+        if (!client.isEnabled()) {
+            return Flows.forwardToSecurityFailurePage(session, realm, uriInfo,
+                    "Login requester not enabled.");
+        }
+
+        event.client(client.getClientId())
+                .detail(Details.REDIRECT_URI, clientSession.getRedirectUri())
+                .detail(Details.RESPONSE_TYPE, "code")
+                .detail(Details.AUTH_METHOD, "form")
+                .detail(Details.USERNAME, username);
+
+        UserModel user = session.users().getUserByUsername(username, realm);
+        if (user == null && username.contains("@")) {
+            user = session.users().getUserByEmail(username, realm);
+        }
+
+        if (user == null) {
+            event.error(Errors.USER_NOT_FOUND);
+        } else if (!user.isEnabled()) {
+            event.user(user).error(Errors.USER_DISABLED);
+        } else if (user.getEmail() == null || user.getEmail().trim().length() == 0) {
+            event.user(user).error(Errors.INVALID_EMAIL);
+        } else {
+            event.user(user);
+
+            UserSessionModel userSession = session.sessions().createUserSession(realm, user, username, clientConnection.getRemoteAddr(), "form", false);
+            event.session(userSession);
+            TokenManager.attachClientSession(userSession, clientSession);
+
+            accessCode.setAction(ClientSessionModel.Action.RECOVER_PASSWORD);
+
+            try {
+                UriBuilder builder = Urls.loginPasswordResetBuilder(uriInfo.getBaseUri());
+                builder.queryParam("key", accessCode.getCode());
+
+                String link = builder.build(realm.getName()).toString();
+                long expiration = TimeUnit.SECONDS.toMinutes(realm.getAccessCodeLifespanUserAction());
+
+                this.session.getProvider(EmailProvider.class).setRealm(realm).setUser(user).sendPasswordReset(link, expiration);
+
+                event.detail(Details.EMAIL, user.getEmail()).detail(Details.CODE_ID, clientSession.getId()).success();
+            } catch (EmailException e) {
+                event.error(Errors.EMAIL_SEND_FAILED);
+                logger.error("Failed to send password reset email", e);
+                return Flows.forms(this.session, realm, client, uriInfo).setError("emailSendError")
+                        .setClientSessionCode(accessCode.getCode())
+                        .createErrorPage();
+            }
+
+            createActionCookie(realm, uriInfo, clientConnection, userSession.getId());
+        }
+
+        return Flows.forms(session, realm, client, uriInfo).setSuccess("emailSent").setClientSessionCode(accessCode.getCode()).createPasswordReset();
+    }
+
+    private String getActionCookie() {
+        Cookie cookie = headers.getCookies().get(ACTION_COOKIE);
+        AuthenticationManager.expireCookie(realm, ACTION_COOKIE, AuthenticationManager.getRealmCookiePath(realm, uriInfo),
+                realm.getSslRequired().isRequired(clientConnection), clientConnection);
+        return cookie != null ? cookie.getValue() : null;
+    }
+
+    public static void createActionCookie(RealmModel realm, UriInfo uriInfo, ClientConnection clientConnection,
+            String sessionId) {
+        CookieHelper.addCookie(ACTION_COOKIE, sessionId, AuthenticationManager.getRealmCookiePath(realm, uriInfo), null,
+                null, -1, realm.getSslRequired().isRequired(clientConnection), true);
+    }
+
+    private Response redirectOauth(UserModel user, ClientSessionCode accessCode, ClientSessionModel clientSession,
+            UserSessionModel userSession) {
+        return AuthenticationManager.nextActionAfterAuthentication(session, userSession, clientSession, clientConnection,
+                request, uriInfo, event);
+    }
+
+    private void initEvent(ClientSessionModel clientSession) {
+        event.event(EventType.LOGIN).client(clientSession.getClient())
+                .user(clientSession.getUserSession().getUser())
+                .session(clientSession.getUserSession().getId())
+                .detail(Details.CODE_ID, clientSession.getId())
+                .detail(Details.REDIRECT_URI, clientSession.getRedirectUri())
+                .detail(Details.RESPONSE_TYPE, "code");
+
+        UserSessionModel userSession = clientSession.getUserSession();
+
+        if (userSession != null) {
+            event.detail(Details.AUTH_METHOD, userSession.getAuthMethod());
+            event.detail(Details.USERNAME, userSession.getLoginUsername());
+            if (userSession.isRememberMe()) {
+                event.detail(Details.REMEMBER_ME, "true");
+            }
+        }
+    }
 }
diff --git a/services/src/main/java/org/keycloak/services/validation/Validation.java b/services/src/main/java/org/keycloak/services/validation/Validation.java
index e983037..5dbb128 100755
--- a/services/src/main/java/org/keycloak/services/validation/Validation.java
+++ b/services/src/main/java/org/keycloak/services/validation/Validation.java
@@ -12,75 +12,73 @@ import org.keycloak.services.messages.Messages;
 
 public class Validation {
 
-	// Actually allow same emails like angular. See ValidationTest.testEmailValidation()
-	private static final Pattern EMAIL_PATTERN = Pattern
-			.compile("[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*");
-
-	public static String validateRegistrationForm(RealmModel realm, MultivaluedMap<String, String> formData,
-			List<String> requiredCredentialTypes) {
-		if (isEmpty(formData.getFirst("firstName"))) {
-			return Messages.MISSING_FIRST_NAME;
-		}
-
-		if (isEmpty(formData.getFirst("lastName"))) {
-			return Messages.MISSING_LAST_NAME;
-		}
-
-		if (isEmpty(formData.getFirst("email"))) {
-			return Messages.MISSING_EMAIL;
-		}
-
-		if (!isEmailValid(formData.getFirst("email"))) {
-			return Messages.INVALID_EMAIL;
-		}
-
-		if (!realm.isRegistrationEmailAsUsername() && isEmpty(formData.getFirst("username"))) {
-			return Messages.MISSING_USERNAME;
-		}
-
-		if (requiredCredentialTypes.contains(CredentialRepresentation.PASSWORD)) {
-			if (isEmpty(formData.getFirst(CredentialRepresentation.PASSWORD))) {
-				return Messages.MISSING_PASSWORD;
-			}
-
-			if (!formData.getFirst("password").equals(formData.getFirst("password-confirm"))) {
-				return Messages.INVALID_PASSWORD_CONFIRM;
-			}
-		}
-
-		return null;
-	}
-
-	public static String validatePassword(MultivaluedMap<String, String> formData, PasswordPolicy policy) {
-		return policy.validate(formData.getFirst("password"));
-	}
-
-	public static String validateUpdateProfileForm(MultivaluedMap<String, String> formData) {
-		if (isEmpty(formData.getFirst("firstName"))) {
-			return Messages.MISSING_FIRST_NAME;
-		}
-
-		if (isEmpty(formData.getFirst("lastName"))) {
-			return Messages.MISSING_LAST_NAME;
-		}
-
-		if (isEmpty(formData.getFirst("email"))) {
-			return Messages.MISSING_EMAIL;
-		}
-
-		if (!isEmailValid(formData.getFirst("email"))) {
-			return Messages.INVALID_EMAIL;
-		}
-
-		return null;
-	}
-
-	public static boolean isEmpty(String s) {
-		return s == null || s.length() == 0;
-	}
-
-	public static boolean isEmailValid(String email) {
-		return EMAIL_PATTERN.matcher(email).matches();
-	}
+    // Actually allow same emails like angular. See ValidationTest.testEmailValidation()
+    private static final Pattern EMAIL_PATTERN = Pattern.compile("[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*");
+
+    public static String validateRegistrationForm(RealmModel realm, MultivaluedMap<String, String> formData, List<String> requiredCredentialTypes) {
+        if (isEmpty(formData.getFirst("firstName"))) {
+            return Messages.MISSING_FIRST_NAME;
+        }
+
+        if (isEmpty(formData.getFirst("lastName"))) {
+            return Messages.MISSING_LAST_NAME;
+        }
+
+        if (isEmpty(formData.getFirst("email"))) {
+            return Messages.MISSING_EMAIL;
+        }
+
+        if (!isEmailValid(formData.getFirst("email"))) {
+            return Messages.INVALID_EMAIL;
+        }
+
+        if (!realm.isRegistrationEmailAsUsername() && isEmpty(formData.getFirst("username"))) {
+            return Messages.MISSING_USERNAME;
+        }
+
+        if (requiredCredentialTypes.contains(CredentialRepresentation.PASSWORD)) {
+            if (isEmpty(formData.getFirst(CredentialRepresentation.PASSWORD))) {
+                return Messages.MISSING_PASSWORD;
+            }
+
+            if (!formData.getFirst("password").equals(formData.getFirst("password-confirm"))) {
+                return Messages.INVALID_PASSWORD_CONFIRM;
+            }
+        }
+
+        return null;
+    }
+
+    public static String validatePassword(MultivaluedMap<String, String> formData, PasswordPolicy policy) {
+        return policy.validate(formData.getFirst("password"));
+    }
+
+    public static String validateUpdateProfileForm(MultivaluedMap<String, String> formData) {
+        if (isEmpty(formData.getFirst("firstName"))) {
+            return Messages.MISSING_FIRST_NAME;
+        }
+
+        if (isEmpty(formData.getFirst("lastName"))) {
+            return Messages.MISSING_LAST_NAME;
+        }
+
+        if (isEmpty(formData.getFirst("email"))) {
+            return Messages.MISSING_EMAIL;
+        }
+
+        if (!isEmailValid(formData.getFirst("email"))) {
+            return Messages.INVALID_EMAIL;
+        }
+
+        return null;
+    }
+
+    public static boolean isEmpty(String s) {
+        return s == null || s.length() == 0;
+    }
+
+    public static boolean isEmailValid(String email) {
+        return EMAIL_PATTERN.matcher(email).matches();
+    }
 
 }
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 d3ff943..925ed06 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
@@ -63,268 +63,265 @@ import org.keycloak.testutils.KeycloakServer;
  */
 public class AdminAPITest {
 
-	@ClassRule
-	public static AbstractKeycloakRule keycloakRule = new AbstractKeycloakRule() {
-		@Override
-		protected void configure(KeycloakSession session, RealmManager manager, RealmModel adminRealm) {
-		}
-	};
-
-	private static String createToken() {
-		KeycloakSession session = keycloakRule.startSession();
-		try {
-			RealmManager manager = new RealmManager(session);
-
-			RealmModel adminRealm = manager.getRealm(Config.getAdminRealm());
-			ApplicationModel adminConsole = adminRealm.getApplicationByName(Constants.ADMIN_CONSOLE_APPLICATION);
-			TokenManager tm = new TokenManager();
-			UserModel admin = session.users().getUserByUsername("admin", adminRealm);
-			UserSessionModel userSession = session.sessions().createUserSession(adminRealm, admin, "admin", null, "form",
-					false);
-			AccessToken token = tm.createClientAccessToken(session, tm.getAccess(null, adminConsole, admin), adminRealm,
-					adminConsole, admin, userSession, null);
-			return tm.encodeToken(adminRealm, token);
-		} finally {
-			keycloakRule.stopSession(session, true);
-		}
-	}
-
-	protected void testCreateRealm(RealmRepresentation rep) {
-		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 adminRealms = client.target(AdminRoot.realmsUrl(authBase));
-		String realmName = rep.getRealm();
-		WebTarget realmTarget = adminRealms.path(realmName);
-
-		// create with just name, enabled, and id, just like admin console
-		RealmRepresentation newRep = new RealmRepresentation();
-		newRep.setRealm(rep.getRealm());
-		newRep.setEnabled(rep.isEnabled());
-		{
-			Response response = adminRealms.request().post(Entity.json(newRep));
-			Assert.assertEquals(201, response.getStatus());
-			response.close();
-		}
-		// todo test with full import with initial create
-		RealmRepresentation storedRealm = realmTarget.request().get(RealmRepresentation.class);
-		checkRealmRep(newRep, storedRealm);
-
-		Response updateResponse = realmTarget.request().put(Entity.json(rep));
-		Assert.assertEquals(204, updateResponse.getStatus());
-		updateResponse.close();
-		storedRealm = realmTarget.request().get(RealmRepresentation.class);
-		checkRealmRep(rep, storedRealm);
-
-		if (rep.getApplications() != null) {
-			WebTarget applicationsTarget = realmTarget.path("applications");
-			for (ApplicationRepresentation appRep : rep.getApplications()) {
-				ApplicationRepresentation newApp = new ApplicationRepresentation();
-				if (appRep.getId() != null)
-					newApp.setId(appRep.getId());
-				newApp.setName(appRep.getName());
-				if (appRep.getSecret() != null) {
-					newApp.setSecret(appRep.getSecret());
-				}
-				Response appCreateResponse = applicationsTarget.request().post(Entity.json(newApp));
-				Assert.assertEquals(201, appCreateResponse.getStatus());
-				appCreateResponse.close();
-				WebTarget appTarget = applicationsTarget.path(appRep.getName());
-				CredentialRepresentation cred = appTarget.path("client-secret").request().get(CredentialRepresentation.class);
-				if (appRep.getSecret() != null)
-					Assert.assertEquals(appRep.getSecret(), cred.getValue());
-				CredentialRepresentation newCred = appTarget.path("client-secret").request()
-						.post(null, CredentialRepresentation.class);
-				Assert.assertNotEquals(newCred.getValue(), cred.getValue());
-
-				Response appUpdateResponse = appTarget.request().put(Entity.json(appRep));
-				Assert.assertEquals(204, appUpdateResponse.getStatus());
-				appUpdateResponse.close();
-
-				ApplicationRepresentation storedApp = appTarget.request().get(ApplicationRepresentation.class);
-
-				checkAppUpdate(appRep, storedApp);
-
-			}
-		}
-
-		// delete realm
-		{
-			Response response = adminRealms.path(realmName).request().delete();
-			Assert.assertEquals(204, response.getStatus());
-			response.close();
-
-		}
-		client.close();
-	}
-
-	protected void checkAppUpdate(ApplicationRepresentation appRep, ApplicationRepresentation storedApp) {
-		if (appRep.getName() != null)
-			Assert.assertEquals(appRep.getName(), storedApp.getName());
-		if (appRep.isEnabled() != null)
-			Assert.assertEquals(appRep.isEnabled(), storedApp.isEnabled());
-		if (appRep.isBearerOnly() != null)
-			Assert.assertEquals(appRep.isBearerOnly(), storedApp.isBearerOnly());
-		if (appRep.isPublicClient() != null)
-			Assert.assertEquals(appRep.isPublicClient(), storedApp.isPublicClient());
-		if (appRep.isFullScopeAllowed() != null)
-			Assert.assertEquals(appRep.isFullScopeAllowed(), storedApp.isFullScopeAllowed());
-		if (appRep.getAdminUrl() != null)
-			Assert.assertEquals(appRep.getAdminUrl(), storedApp.getAdminUrl());
-		if (appRep.getBaseUrl() != null)
-			Assert.assertEquals(appRep.getBaseUrl(), storedApp.getBaseUrl());
-		if (appRep.isSurrogateAuthRequired() != null)
-			Assert.assertEquals(appRep.isSurrogateAuthRequired(), storedApp.isSurrogateAuthRequired());
-
-		if (appRep.getNotBefore() != null) {
-			Assert.assertEquals(appRep.getNotBefore(), storedApp.getNotBefore());
-		}
-		if (appRep.getDefaultRoles() != null) {
-			Set<String> set = new HashSet<String>();
-			for (String val : appRep.getDefaultRoles()) {
-				set.add(val);
-			}
-			Set<String> storedSet = new HashSet<String>();
-			for (String val : storedApp.getDefaultRoles()) {
-				storedSet.add(val);
-			}
-
-			Assert.assertEquals(set, storedSet);
-		}
-
-		List<String> redirectUris = appRep.getRedirectUris();
-		if (redirectUris != null) {
-			Set<String> set = new HashSet<String>();
-			for (String val : appRep.getRedirectUris()) {
-				set.add(val);
-			}
-			Set<String> storedSet = new HashSet<String>();
-			for (String val : storedApp.getRedirectUris()) {
-				storedSet.add(val);
-			}
-
-			Assert.assertEquals(set, storedSet);
-		}
-
-		List<String> webOrigins = appRep.getWebOrigins();
-		if (webOrigins != null) {
-			Set<String> set = new HashSet<String>();
-			for (String val : appRep.getWebOrigins()) {
-				set.add(val);
-			}
-			Set<String> storedSet = new HashSet<String>();
-			for (String val : storedApp.getWebOrigins()) {
-				storedSet.add(val);
-			}
-
-			Assert.assertEquals(set, storedSet);
-		}
-	}
-
-	protected void checkRealmRep(RealmRepresentation rep, RealmRepresentation storedRealm) {
-		if (rep.getId() != null) {
-			Assert.assertEquals(rep.getId(), storedRealm.getId());
-		}
-		if (rep.getRealm() != null) {
-			Assert.assertEquals(rep.getRealm(), storedRealm.getRealm());
-		}
-		if (rep.isEnabled() != null)
-			Assert.assertEquals(rep.isEnabled(), storedRealm.isEnabled());
-		if (rep.isBruteForceProtected() != null)
-			Assert.assertEquals(rep.isBruteForceProtected(), storedRealm.isBruteForceProtected());
-		if (rep.getMaxFailureWaitSeconds() != null)
-			Assert.assertEquals(rep.getMaxFailureWaitSeconds(), storedRealm.getMaxFailureWaitSeconds());
-		if (rep.getMinimumQuickLoginWaitSeconds() != null)
-			Assert.assertEquals(rep.getMinimumQuickLoginWaitSeconds(), storedRealm.getMinimumQuickLoginWaitSeconds());
-		if (rep.getWaitIncrementSeconds() != null)
-			Assert.assertEquals(rep.getWaitIncrementSeconds(), storedRealm.getWaitIncrementSeconds());
-		if (rep.getQuickLoginCheckMilliSeconds() != null)
-			Assert.assertEquals(rep.getQuickLoginCheckMilliSeconds(), storedRealm.getQuickLoginCheckMilliSeconds());
-		if (rep.getMaxDeltaTimeSeconds() != null)
-			Assert.assertEquals(rep.getMaxDeltaTimeSeconds(), storedRealm.getMaxDeltaTimeSeconds());
-		if (rep.getFailureFactor() != null)
-			Assert.assertEquals(rep.getFailureFactor(), storedRealm.getFailureFactor());
-		if (rep.isPasswordCredentialGrantAllowed() != null)
-			Assert.assertEquals(rep.isPasswordCredentialGrantAllowed(), storedRealm.isPasswordCredentialGrantAllowed());
-		if (rep.isRegistrationAllowed() != null)
-			Assert.assertEquals(rep.isRegistrationAllowed(), storedRealm.isRegistrationAllowed());
-		if (rep.isRegistrationEmailAsUsername() != null)
-			Assert.assertEquals(rep.isRegistrationEmailAsUsername(), storedRealm.isRegistrationEmailAsUsername());
-		if (rep.isRememberMe() != null)
-			Assert.assertEquals(rep.isRememberMe(), storedRealm.isRememberMe());
-		if (rep.isVerifyEmail() != null)
-			Assert.assertEquals(rep.isVerifyEmail(), storedRealm.isVerifyEmail());
-		if (rep.isResetPasswordAllowed() != null)
-			Assert.assertEquals(rep.isResetPasswordAllowed(), storedRealm.isResetPasswordAllowed());
-		if (rep.getSslRequired() != null)
-			Assert.assertEquals(rep.getSslRequired(), storedRealm.getSslRequired());
-		if (rep.getAccessCodeLifespan() != null)
-			Assert.assertEquals(rep.getAccessCodeLifespan(), storedRealm.getAccessCodeLifespan());
-		if (rep.getAccessCodeLifespanUserAction() != null)
-			Assert.assertEquals(rep.getAccessCodeLifespanUserAction(), storedRealm.getAccessCodeLifespanUserAction());
-		if (rep.getNotBefore() != null)
-			Assert.assertEquals(rep.getNotBefore(), storedRealm.getNotBefore());
-		if (rep.getAccessTokenLifespan() != null)
-			Assert.assertEquals(rep.getAccessTokenLifespan(), storedRealm.getAccessTokenLifespan());
-		if (rep.getSsoSessionIdleTimeout() != null)
-			Assert.assertEquals(rep.getSsoSessionIdleTimeout(), storedRealm.getSsoSessionIdleTimeout());
-		if (rep.getSsoSessionMaxLifespan() != null)
-			Assert.assertEquals(rep.getSsoSessionMaxLifespan(), storedRealm.getSsoSessionMaxLifespan());
-		if (rep.getRequiredCredentials() != null) {
-			Assert.assertNotNull(storedRealm.getRequiredCredentials());
-			for (String cred : rep.getRequiredCredentials()) {
-				Assert.assertTrue(storedRealm.getRequiredCredentials().contains(cred));
-			}
-		}
-		if (rep.getLoginTheme() != null)
-			Assert.assertEquals(rep.getLoginTheme(), storedRealm.getLoginTheme());
-		if (rep.getAccountTheme() != null)
-			Assert.assertEquals(rep.getAccountTheme(), storedRealm.getAccountTheme());
-		if (rep.getAdminTheme() != null)
-			Assert.assertEquals(rep.getAdminTheme(), storedRealm.getAdminTheme());
-		if (rep.getEmailTheme() != null)
-			Assert.assertEquals(rep.getEmailTheme(), storedRealm.getEmailTheme());
-
-		if (rep.getPasswordPolicy() != null)
-			Assert.assertEquals(rep.getPasswordPolicy(), storedRealm.getPasswordPolicy());
-
-		if (rep.getDefaultRoles() != null) {
-			Assert.assertNotNull(storedRealm.getDefaultRoles());
-			for (String role : rep.getDefaultRoles()) {
-				Assert.assertTrue(storedRealm.getDefaultRoles().contains(role));
-			}
-		}
-
-		if (rep.getSmtpServer() != null) {
-			Assert.assertEquals(rep.getSmtpServer(), storedRealm.getSmtpServer());
-		}
-
-		if (rep.getBrowserSecurityHeaders() != null) {
-			Assert.assertEquals(rep.getBrowserSecurityHeaders(), storedRealm.getBrowserSecurityHeaders());
-		}
-
-	}
-
-	protected void testCreateRealm(String path) {
-		RealmRepresentation rep = KeycloakServer.loadJson(getClass().getResourceAsStream(path), RealmRepresentation.class);
-		Assert.assertNotNull(rep);
-		testCreateRealm(rep);
-	}
-
-	@Test
-	public void testAdminApi() {
-		RealmRepresentation empty = new RealmRepresentation();
-		empty.setEnabled(true);
-		empty.setRealm("empty");
-		testCreateRealm(empty);
-		testCreateRealm("/admin-test/testrealm.json");
-	}
+    @ClassRule
+    public static AbstractKeycloakRule keycloakRule = new AbstractKeycloakRule() {
+        @Override
+        protected void configure(KeycloakSession session, RealmManager manager, RealmModel adminRealm) {
+        }
+    };
+
+    private static String createToken() {
+        KeycloakSession session = keycloakRule.startSession();
+        try {
+            RealmManager manager = new RealmManager(session);
+
+            RealmModel adminRealm = manager.getRealm(Config.getAdminRealm());
+            ApplicationModel adminConsole = adminRealm.getApplicationByName(Constants.ADMIN_CONSOLE_APPLICATION);
+            TokenManager tm = new TokenManager();
+            UserModel admin = session.users().getUserByUsername("admin", adminRealm);
+            UserSessionModel userSession = session.sessions().createUserSession(adminRealm, admin, "admin", null, "form", false);
+            AccessToken token = tm.createClientAccessToken(session, tm.getAccess(null, adminConsole, admin), adminRealm, adminConsole, admin, userSession, null);
+            return tm.encodeToken(adminRealm, token);
+        } finally {
+            keycloakRule.stopSession(session, true);
+        }
+    }
+
+    protected void testCreateRealm(RealmRepresentation rep) {
+        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 adminRealms = client.target(AdminRoot.realmsUrl(authBase));
+        String realmName = rep.getRealm();
+        WebTarget realmTarget = adminRealms.path(realmName);
+
+        // create with just name, enabled, and id, just like admin console
+        RealmRepresentation newRep = new RealmRepresentation();
+        newRep.setRealm(rep.getRealm());
+        newRep.setEnabled(rep.isEnabled());
+        {
+            Response response = adminRealms.request().post(Entity.json(newRep));
+            Assert.assertEquals(201, response.getStatus());
+            response.close();
+        }
+        // todo test with full import with initial create
+        RealmRepresentation storedRealm = realmTarget.request().get(RealmRepresentation.class);
+        checkRealmRep(newRep, storedRealm);
+
+        Response updateResponse = realmTarget.request().put(Entity.json(rep));
+        Assert.assertEquals(204, updateResponse.getStatus());
+        updateResponse.close();
+        storedRealm = realmTarget.request().get(RealmRepresentation.class);
+        checkRealmRep(rep, storedRealm);
+
+        if (rep.getApplications() != null) {
+            WebTarget applicationsTarget = realmTarget.path("applications");
+            for (ApplicationRepresentation appRep : rep.getApplications()) {
+                ApplicationRepresentation newApp = new ApplicationRepresentation();
+                if (appRep.getId() != null)
+                    newApp.setId(appRep.getId());
+                newApp.setName(appRep.getName());
+                if (appRep.getSecret() != null) {
+                    newApp.setSecret(appRep.getSecret());
+                }
+                Response appCreateResponse = applicationsTarget.request().post(Entity.json(newApp));
+                Assert.assertEquals(201, appCreateResponse.getStatus());
+                appCreateResponse.close();
+                WebTarget appTarget = applicationsTarget.path(appRep.getName());
+                CredentialRepresentation cred = appTarget.path("client-secret").request().get(CredentialRepresentation.class);
+                if (appRep.getSecret() != null)
+                    Assert.assertEquals(appRep.getSecret(), cred.getValue());
+                CredentialRepresentation newCred = appTarget.path("client-secret").request().post(null, CredentialRepresentation.class);
+                Assert.assertNotEquals(newCred.getValue(), cred.getValue());
+
+                Response appUpdateResponse = appTarget.request().put(Entity.json(appRep));
+                Assert.assertEquals(204, appUpdateResponse.getStatus());
+                appUpdateResponse.close();
+
+                ApplicationRepresentation storedApp = appTarget.request().get(ApplicationRepresentation.class);
+
+                checkAppUpdate(appRep, storedApp);
+
+            }
+        }
+
+        // delete realm
+        {
+            Response response = adminRealms.path(realmName).request().delete();
+            Assert.assertEquals(204, response.getStatus());
+            response.close();
+
+        }
+        client.close();
+    }
+
+    protected void checkAppUpdate(ApplicationRepresentation appRep, ApplicationRepresentation storedApp) {
+        if (appRep.getName() != null)
+            Assert.assertEquals(appRep.getName(), storedApp.getName());
+        if (appRep.isEnabled() != null)
+            Assert.assertEquals(appRep.isEnabled(), storedApp.isEnabled());
+        if (appRep.isBearerOnly() != null)
+            Assert.assertEquals(appRep.isBearerOnly(), storedApp.isBearerOnly());
+        if (appRep.isPublicClient() != null)
+            Assert.assertEquals(appRep.isPublicClient(), storedApp.isPublicClient());
+        if (appRep.isFullScopeAllowed() != null)
+            Assert.assertEquals(appRep.isFullScopeAllowed(), storedApp.isFullScopeAllowed());
+        if (appRep.getAdminUrl() != null)
+            Assert.assertEquals(appRep.getAdminUrl(), storedApp.getAdminUrl());
+        if (appRep.getBaseUrl() != null)
+            Assert.assertEquals(appRep.getBaseUrl(), storedApp.getBaseUrl());
+        if (appRep.isSurrogateAuthRequired() != null)
+            Assert.assertEquals(appRep.isSurrogateAuthRequired(), storedApp.isSurrogateAuthRequired());
+
+        if (appRep.getNotBefore() != null) {
+            Assert.assertEquals(appRep.getNotBefore(), storedApp.getNotBefore());
+        }
+        if (appRep.getDefaultRoles() != null) {
+            Set<String> set = new HashSet<String>();
+            for (String val : appRep.getDefaultRoles()) {
+                set.add(val);
+            }
+            Set<String> storedSet = new HashSet<String>();
+            for (String val : storedApp.getDefaultRoles()) {
+                storedSet.add(val);
+            }
+
+            Assert.assertEquals(set, storedSet);
+        }
+
+        List<String> redirectUris = appRep.getRedirectUris();
+        if (redirectUris != null) {
+            Set<String> set = new HashSet<String>();
+            for (String val : appRep.getRedirectUris()) {
+                set.add(val);
+            }
+            Set<String> storedSet = new HashSet<String>();
+            for (String val : storedApp.getRedirectUris()) {
+                storedSet.add(val);
+            }
+
+            Assert.assertEquals(set, storedSet);
+        }
+
+        List<String> webOrigins = appRep.getWebOrigins();
+        if (webOrigins != null) {
+            Set<String> set = new HashSet<String>();
+            for (String val : appRep.getWebOrigins()) {
+                set.add(val);
+            }
+            Set<String> storedSet = new HashSet<String>();
+            for (String val : storedApp.getWebOrigins()) {
+                storedSet.add(val);
+            }
+
+            Assert.assertEquals(set, storedSet);
+        }
+    }
+
+    protected void checkRealmRep(RealmRepresentation rep, RealmRepresentation storedRealm) {
+        if (rep.getId() != null) {
+            Assert.assertEquals(rep.getId(), storedRealm.getId());
+        }
+        if (rep.getRealm() != null) {
+            Assert.assertEquals(rep.getRealm(), storedRealm.getRealm());
+        }
+        if (rep.isEnabled() != null)
+            Assert.assertEquals(rep.isEnabled(), storedRealm.isEnabled());
+        if (rep.isBruteForceProtected() != null)
+            Assert.assertEquals(rep.isBruteForceProtected(), storedRealm.isBruteForceProtected());
+        if (rep.getMaxFailureWaitSeconds() != null)
+            Assert.assertEquals(rep.getMaxFailureWaitSeconds(), storedRealm.getMaxFailureWaitSeconds());
+        if (rep.getMinimumQuickLoginWaitSeconds() != null)
+            Assert.assertEquals(rep.getMinimumQuickLoginWaitSeconds(), storedRealm.getMinimumQuickLoginWaitSeconds());
+        if (rep.getWaitIncrementSeconds() != null)
+            Assert.assertEquals(rep.getWaitIncrementSeconds(), storedRealm.getWaitIncrementSeconds());
+        if (rep.getQuickLoginCheckMilliSeconds() != null)
+            Assert.assertEquals(rep.getQuickLoginCheckMilliSeconds(), storedRealm.getQuickLoginCheckMilliSeconds());
+        if (rep.getMaxDeltaTimeSeconds() != null)
+            Assert.assertEquals(rep.getMaxDeltaTimeSeconds(), storedRealm.getMaxDeltaTimeSeconds());
+        if (rep.getFailureFactor() != null)
+            Assert.assertEquals(rep.getFailureFactor(), storedRealm.getFailureFactor());
+        if (rep.isPasswordCredentialGrantAllowed() != null)
+            Assert.assertEquals(rep.isPasswordCredentialGrantAllowed(), storedRealm.isPasswordCredentialGrantAllowed());
+        if (rep.isRegistrationAllowed() != null)
+            Assert.assertEquals(rep.isRegistrationAllowed(), storedRealm.isRegistrationAllowed());
+        if (rep.isRegistrationEmailAsUsername() != null)
+            Assert.assertEquals(rep.isRegistrationEmailAsUsername(), storedRealm.isRegistrationEmailAsUsername());
+        if (rep.isRememberMe() != null)
+            Assert.assertEquals(rep.isRememberMe(), storedRealm.isRememberMe());
+        if (rep.isVerifyEmail() != null)
+            Assert.assertEquals(rep.isVerifyEmail(), storedRealm.isVerifyEmail());
+        if (rep.isResetPasswordAllowed() != null)
+            Assert.assertEquals(rep.isResetPasswordAllowed(), storedRealm.isResetPasswordAllowed());
+        if (rep.getSslRequired() != null)
+            Assert.assertEquals(rep.getSslRequired(), storedRealm.getSslRequired());
+        if (rep.getAccessCodeLifespan() != null)
+            Assert.assertEquals(rep.getAccessCodeLifespan(), storedRealm.getAccessCodeLifespan());
+        if (rep.getAccessCodeLifespanUserAction() != null)
+            Assert.assertEquals(rep.getAccessCodeLifespanUserAction(), storedRealm.getAccessCodeLifespanUserAction());
+        if (rep.getNotBefore() != null)
+            Assert.assertEquals(rep.getNotBefore(), storedRealm.getNotBefore());
+        if (rep.getAccessTokenLifespan() != null)
+            Assert.assertEquals(rep.getAccessTokenLifespan(), storedRealm.getAccessTokenLifespan());
+        if (rep.getSsoSessionIdleTimeout() != null)
+            Assert.assertEquals(rep.getSsoSessionIdleTimeout(), storedRealm.getSsoSessionIdleTimeout());
+        if (rep.getSsoSessionMaxLifespan() != null)
+            Assert.assertEquals(rep.getSsoSessionMaxLifespan(), storedRealm.getSsoSessionMaxLifespan());
+        if (rep.getRequiredCredentials() != null) {
+            Assert.assertNotNull(storedRealm.getRequiredCredentials());
+            for (String cred : rep.getRequiredCredentials()) {
+                Assert.assertTrue(storedRealm.getRequiredCredentials().contains(cred));
+            }
+        }
+        if (rep.getLoginTheme() != null)
+            Assert.assertEquals(rep.getLoginTheme(), storedRealm.getLoginTheme());
+        if (rep.getAccountTheme() != null)
+            Assert.assertEquals(rep.getAccountTheme(), storedRealm.getAccountTheme());
+        if (rep.getAdminTheme() != null)
+            Assert.assertEquals(rep.getAdminTheme(), storedRealm.getAdminTheme());
+        if (rep.getEmailTheme() != null)
+            Assert.assertEquals(rep.getEmailTheme(), storedRealm.getEmailTheme());
+
+        if (rep.getPasswordPolicy() != null)
+            Assert.assertEquals(rep.getPasswordPolicy(), storedRealm.getPasswordPolicy());
+
+        if (rep.getDefaultRoles() != null) {
+            Assert.assertNotNull(storedRealm.getDefaultRoles());
+            for (String role : rep.getDefaultRoles()) {
+                Assert.assertTrue(storedRealm.getDefaultRoles().contains(role));
+            }
+        }
+
+        if (rep.getSmtpServer() != null) {
+            Assert.assertEquals(rep.getSmtpServer(), storedRealm.getSmtpServer());
+        }
+
+        if (rep.getBrowserSecurityHeaders() != null) {
+            Assert.assertEquals(rep.getBrowserSecurityHeaders(), storedRealm.getBrowserSecurityHeaders());
+        }
+
+    }
+
+    protected void testCreateRealm(String path) {
+        RealmRepresentation rep = KeycloakServer.loadJson(getClass().getResourceAsStream(path), RealmRepresentation.class);
+        Assert.assertNotNull(rep);
+        testCreateRealm(rep);
+    }
+
+    @Test
+    public void testAdminApi() {
+        RealmRepresentation empty = new RealmRepresentation();
+        empty.setEnabled(true);
+        empty.setRealm("empty");
+        testCreateRealm(empty);
+        testCreateRealm("/admin-test/testrealm.json");
+    }
 
 }
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/ModelTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/ModelTest.java
index 9e2147d..9a9ed25 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/ModelTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/ModelTest.java
@@ -13,65 +13,65 @@ import org.keycloak.representations.idm.RealmRepresentation;
 
 public class ModelTest extends AbstractModelTest {
 
-	@Test
-	public void importExportRealm() {
-		RealmModel realm = realmManager.createRealm("original");
-		realm.setRegistrationAllowed(true);
-		realm.setRegistrationEmailAsUsername(true);
-		realm.setResetPasswordAllowed(true);
-		realm.setSslRequired(SslRequired.EXTERNAL);
-		realm.setVerifyEmail(true);
-		realm.setAccessTokenLifespan(1000);
-		realm.setPasswordPolicy(new PasswordPolicy("length"));
-		realm.setAccessCodeLifespan(1001);
-		realm.setAccessCodeLifespanUserAction(1002);
-		KeycloakModelUtils.generateRealmKeys(realm);
-		realm.addDefaultRole("default-role");
+    @Test
+    public void importExportRealm() {
+        RealmModel realm = realmManager.createRealm("original");
+        realm.setRegistrationAllowed(true);
+        realm.setRegistrationEmailAsUsername(true);
+        realm.setResetPasswordAllowed(true);
+        realm.setSslRequired(SslRequired.EXTERNAL);
+        realm.setVerifyEmail(true);
+        realm.setAccessTokenLifespan(1000);
+        realm.setPasswordPolicy(new PasswordPolicy("length"));
+        realm.setAccessCodeLifespan(1001);
+        realm.setAccessCodeLifespanUserAction(1002);
+        KeycloakModelUtils.generateRealmKeys(realm);
+        realm.addDefaultRole("default-role");
 
-		HashMap<String, String> smtp = new HashMap<String, String>();
-		smtp.put("from", "auto@keycloak");
-		smtp.put("hostname", "localhost");
-		realm.setSmtpConfig(smtp);
+        HashMap<String, String> smtp = new HashMap<String, String>();
+        smtp.put("from", "auto@keycloak");
+        smtp.put("hostname", "localhost");
+        realm.setSmtpConfig(smtp);
 
-		HashMap<String, String> social = new HashMap<String, String>();
-		social.put("google.key", "1234");
-		social.put("google.secret", "5678");
-		// FIXME: KEYCLOAK-883
-		// realm.setSocialConfig(social);
+        HashMap<String, String> social = new HashMap<String, String>();
+        social.put("google.key", "1234");
+        social.put("google.secret", "5678");
+        // FIXME: KEYCLOAK-883
+        // realm.setSocialConfig(social);
 
-		RealmModel persisted = realmManager.getRealm(realm.getId());
-		assertEquals(realm, persisted);
+        RealmModel persisted = realmManager.getRealm(realm.getId());
+        assertEquals(realm, persisted);
 
-		RealmModel copy = importExport(realm, "copy");
-		assertEquals(realm, copy);
-	}
+        RealmModel copy = importExport(realm, "copy");
+        assertEquals(realm, copy);
+    }
 
-	public static void assertEquals(RealmModel expected, RealmModel actual) {
-		Assert.assertEquals(expected.isRegistrationAllowed(), actual.isRegistrationAllowed());
-		Assert.assertEquals(expected.isRegistrationEmailAsUsername(), actual.isRegistrationEmailAsUsername());
-		Assert.assertEquals(expected.isResetPasswordAllowed(), actual.isResetPasswordAllowed());
-		Assert.assertEquals(expected.getSslRequired(), actual.getSslRequired());
-		Assert.assertEquals(expected.isVerifyEmail(), actual.isVerifyEmail());
-		Assert.assertEquals(expected.getAccessTokenLifespan(), actual.getAccessTokenLifespan());
+    public static void assertEquals(RealmModel expected, RealmModel actual) {
+        Assert.assertEquals(expected.isRegistrationAllowed(), actual.isRegistrationAllowed());
+        Assert.assertEquals(expected.isRegistrationEmailAsUsername(), actual.isRegistrationEmailAsUsername());
+        Assert.assertEquals(expected.isResetPasswordAllowed(), actual.isResetPasswordAllowed());
+        Assert.assertEquals(expected.getSslRequired(), actual.getSslRequired());
+        Assert.assertEquals(expected.isVerifyEmail(), actual.isVerifyEmail());
+        Assert.assertEquals(expected.getAccessTokenLifespan(), actual.getAccessTokenLifespan());
 
-		Assert.assertEquals(expected.getAccessCodeLifespan(), actual.getAccessCodeLifespan());
-		Assert.assertEquals(expected.getAccessCodeLifespanUserAction(), actual.getAccessCodeLifespanUserAction());
-		Assert.assertEquals(expected.getPublicKeyPem(), actual.getPublicKeyPem());
-		Assert.assertEquals(expected.getPrivateKeyPem(), actual.getPrivateKeyPem());
+        Assert.assertEquals(expected.getAccessCodeLifespan(), actual.getAccessCodeLifespan());
+        Assert.assertEquals(expected.getAccessCodeLifespanUserAction(), actual.getAccessCodeLifespanUserAction());
+        Assert.assertEquals(expected.getPublicKeyPem(), actual.getPublicKeyPem());
+        Assert.assertEquals(expected.getPrivateKeyPem(), actual.getPrivateKeyPem());
 
-		Assert.assertEquals(expected.getDefaultRoles(), actual.getDefaultRoles());
+        Assert.assertEquals(expected.getDefaultRoles(), actual.getDefaultRoles());
 
-		Assert.assertEquals(expected.getSmtpConfig(), actual.getSmtpConfig());
-		// FIXME: KEYCLOAK-883
-		// Assert.assertEquals(expected.getSocialConfig(), actual.getSocialConfig());
-	}
+        Assert.assertEquals(expected.getSmtpConfig(), actual.getSmtpConfig());
+        // FIXME: KEYCLOAK-883
+        // Assert.assertEquals(expected.getSocialConfig(), actual.getSocialConfig());
+    }
 
-	private RealmModel importExport(RealmModel src, String copyName) {
-		RealmRepresentation representation = ModelToRepresentation.toRepresentation(src, true);
-		representation.setRealm(copyName);
-		representation.setId(copyName);
-		RealmModel copy = realmManager.importRealm(representation);
-		return realmManager.getRealm(copy.getId());
-	}
+    private RealmModel importExport(RealmModel src, String copyName) {
+        RealmRepresentation representation = ModelToRepresentation.toRepresentation(src, true);
+        representation.setRealm(copyName);
+        representation.setId(copyName);
+        RealmModel copy = realmManager.importRealm(representation);
+        return realmManager.getRealm(copy.getId());
+    }
 
 }