diff --git a/account/applications.ftl b/account/applications.ftl
index 0c0906d..c9e7022 100755
--- a/account/applications.ftl
+++ b/account/applications.ftl
@@ -69,7 +69,6 @@
<#if (application.client.consentRequired && application.clientScopesGranted?has_content) || application.additionalGrants?has_content>
+ <#else>
+
+ #if>
+
+ #if>
+@layout.registrationLayout>
\ No newline at end of file
diff --git a/login/login-idp-link-confirm.ftl b/login/login-idp-link-confirm.ftl
new file mode 100644
index 0000000..c3537c5
--- /dev/null
+++ b/login/login-idp-link-confirm.ftl
@@ -0,0 +1,13 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+ <#if section = "header">
+ ${msg("confirmLinkIdpTitle")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/login-idp-link-email.ftl b/login/login-idp-link-email.ftl
new file mode 100644
index 0000000..0020178
--- /dev/null
+++ b/login/login-idp-link-email.ftl
@@ -0,0 +1,16 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+ <#if section = "header">
+ ${msg("emailLinkIdpTitle", idpDisplayName)}
+ <#elseif section = "form">
+
+ ${msg("emailLinkIdp1", idpDisplayName, brokerContext.username, realm.displayName)}
+
+
+ ${msg("emailLinkIdp2")} ${msg("doClickHere")} ${msg("emailLinkIdp3")}
+
+
+ ${msg("emailLinkIdp4")} ${msg("doClickHere")} ${msg("emailLinkIdp5")}
+
+ #if>
+@layout.registrationLayout>
\ No newline at end of file
diff --git a/login/login-oauth-grant.ftl b/login/login-oauth-grant.ftl
new file mode 100755
index 0000000..d5cfc4a
--- /dev/null
+++ b/login/login-oauth-grant.ftl
@@ -0,0 +1,68 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout bodyClass="oauth"; section>
+ <#if section = "header">
+ <#if client.attributes.logoUri??>
+
+ #if>
+
+ <#if client.name?has_content>
+ ${msg("oauthGrantTitle",advancedMsg(client.name))}
+ <#else>
+ ${msg("oauthGrantTitle",client.clientId)}
+ #if>
+
+ <#elseif section = "form">
+
+ ${msg("oauthGrantRequest")}
+
+ <#if oauth.clientScopesRequested??>
+ <#list oauth.clientScopesRequested as clientScope>
+ -
+ <#if !clientScope.dynamicScopeParameter??>
+ ${advancedMsg(clientScope.consentScreenText)}
+ <#else>
+ ${advancedMsg(clientScope.consentScreenText)}: ${clientScope.dynamicScopeParameter}
+ #if>
+
+
+ #list>
+ #if>
+
+ <#if client.attributes.policyUri?? || client.attributes.tosUri??>
+
+ <#if client.name?has_content>
+ ${msg("oauthGrantInformation",advancedMsg(client.name))}
+ <#else>
+ ${msg("oauthGrantInformation",client.clientId)}
+ #if>
+ <#if client.attributes.tosUri??>
+ ${msg("oauthGrantReview")}
+ ${msg("oauthGrantTos")}
+ #if>
+ <#if client.attributes.policyUri??>
+ ${msg("oauthGrantReview")}
+ ${msg("oauthGrantPolicy")}
+ #if>
+
+ #if>
+
+
+
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/login-oauth2-device-verify-user-code.ftl b/login/login-oauth2-device-verify-user-code.ftl
new file mode 100644
index 0000000..dfb625f
--- /dev/null
+++ b/login/login-oauth2-device-verify-user-code.ftl
@@ -0,0 +1,31 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+ <#if section = "header">
+ ${msg("oauth2DeviceVerificationTitle")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
\ No newline at end of file
diff --git a/login/login-otp.ftl b/login/login-otp.ftl
new file mode 100755
index 0000000..a43778d
--- /dev/null
+++ b/login/login-otp.ftl
@@ -0,0 +1,58 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('totp'); section>
+ <#if section="header">
+ ${msg("doLogIn")}
+ <#elseif section="form">
+
+ #if>
+@layout.registrationLayout>
\ No newline at end of file
diff --git a/login/login-page-expired.ftl b/login/login-page-expired.ftl
new file mode 100644
index 0000000..2b470e0
--- /dev/null
+++ b/login/login-page-expired.ftl
@@ -0,0 +1,11 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+ <#if section = "header">
+ ${msg("pageExpiredTitle")}
+ <#elseif section = "form">
+
+ ${msg("pageExpiredMsg1")} ${msg("doClickHere")} .
+ ${msg("pageExpiredMsg2")} ${msg("doClickHere")} .
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/login-password.ftl b/login/login-password.ftl
new file mode 100755
index 0000000..a0b5bcc
--- /dev/null
+++ b/login/login-password.ftl
@@ -0,0 +1,43 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('password'); section>
+ <#if section = "header">
+ ${msg("doLogIn")}
+ <#elseif section = "form">
+
+ #if>
+
+@layout.registrationLayout>
diff --git a/login/login-recovery-authn-code-config.ftl b/login/login-recovery-authn-code-config.ftl
new file mode 100644
index 0000000..5bd3559
--- /dev/null
+++ b/login/login-recovery-authn-code-config.ftl
@@ -0,0 +1,184 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+
+<#if section = "header">
+ ${msg("recovery-code-config-header")}
+<#elseif section = "form">
+
+
+
+
+
+
+ Warning alert:
+ ${msg("recovery-code-config-warning-title")}
+
+
+ ${msg("recovery-code-config-warning-message")}
+
+
+
+
+ <#list recoveryAuthnCodesConfigBean.generatedRecoveryAuthnCodesList as code>
+ - ${code?counter}: ${code[0..3]}-${code[4..7]}-${code[8..]}
+ #list>
+
+
+
+
+
+ ${msg("recovery-codes-print")}
+
+
+ ${msg("recovery-codes-download")}
+
+
+ ${msg("recovery-codes-copy")}
+
+
+
+
+
+
+
+
+
+
+
+
+#if>
+@layout.registrationLayout>
diff --git a/login/login-recovery-authn-code-input.ftl b/login/login-recovery-authn-code-input.ftl
new file mode 100644
index 0000000..f6cad67
--- /dev/null
+++ b/login/login-recovery-authn-code-input.ftl
@@ -0,0 +1,32 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+
+ <#if section = "header">
+ ${msg("auth-recovery-code-header")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
\ No newline at end of file
diff --git a/login/login-reset-password.ftl b/login/login-reset-password.ftl
new file mode 100755
index 0000000..518e3e6
--- /dev/null
+++ b/login/login-reset-password.ftl
@@ -0,0 +1,50 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayInfo=true displayMessage=!messagesPerField.existsError('username'); section>
+ <#if section = "header">
+ ${msg("emailForgotTitle")}
+ <#elseif section = "info" >
+ <#if realm.duplicateEmailsAllowed>
+ ${msg("emailInstructionUsername")}
+ <#else>
+ ${msg("emailInstruction")}
+ #if>
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/login-update-password.ftl b/login/login-update-password.ftl
new file mode 100755
index 0000000..b884d75
--- /dev/null
+++ b/login/login-update-password.ftl
@@ -0,0 +1,71 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('password','password-confirm'); section>
+ <#if section = "header">
+ ${msg("updatePasswordTitle")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
\ No newline at end of file
diff --git a/login/login-update-profile.ftl b/login/login-update-profile.ftl
new file mode 100755
index 0000000..be579b0
--- /dev/null
+++ b/login/login-update-profile.ftl
@@ -0,0 +1,99 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username','email','firstName','lastName'); section>
+ <#if section = "header">
+ ${msg("loginProfileTitle")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/login-username.ftl b/login/login-username.ftl
new file mode 100755
index 0000000..02ced45
--- /dev/null
+++ b/login/login-username.ftl
@@ -0,0 +1,87 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username') displayInfo=(realm.password && realm.registrationAllowed && !registrationDisabled??); section>
+ <#if section = "header">
+ ${msg("loginAccountTitle")}
+ <#elseif section = "form">
+
+
+ <#elseif section = "info" >
+ <#if realm.password && realm.registrationAllowed && !registrationDisabled??>
+
+ #if>
+ <#elseif section = "socialProviders" >
+ <#if realm.password && social.providers??>
+
+ #if>
+ #if>
+
+@layout.registrationLayout>
diff --git a/login/login-verify-email.ftl b/login/login-verify-email.ftl
new file mode 100755
index 0000000..b47d8ca
--- /dev/null
+++ b/login/login-verify-email.ftl
@@ -0,0 +1,14 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayInfo=true; section>
+ <#if section = "header">
+ ${msg("emailVerifyTitle")}
+ <#elseif section = "form">
+ ${msg("emailVerifyInstruction1",user.email)}
+ <#elseif section = "info">
+
+ ${msg("emailVerifyInstruction2")}
+
+ ${msg("doClickHere")} ${msg("emailVerifyInstruction3")}
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/login-x509-info.ftl b/login/login-x509-info.ftl
new file mode 100644
index 0000000..0228b06
--- /dev/null
+++ b/login/login-x509-info.ftl
@@ -0,0 +1,55 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+ <#if section = "header">
+ ${msg("doLogIn")}
+ <#elseif section = "form">
+
+
+ #if>
+
+@layout.registrationLayout>
diff --git a/login/login.ftl b/login/login.ftl
index 17b524f..51d2102 100644
--- a/login/login.ftl
+++ b/login/login.ftl
@@ -58,6 +58,11 @@
#if>
+ <#if realm.resetPasswordAllowed>
+
+ #if>
@@ -72,11 +77,6 @@
#if>
- <#if realm.resetPasswordAllowed>
-
- #if>
diff --git a/login/logout-confirm.ftl b/login/logout-confirm.ftl
new file mode 100644
index 0000000..6c0b4e9
--- /dev/null
+++ b/login/logout-confirm.ftl
@@ -0,0 +1,38 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+ <#if section = "header">
+ ${msg("logoutConfirmTitle")}
+ <#elseif section = "form">
+
+ ${msg("logoutConfirmHeader")}
+
+
+
+
+
+
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/register-user-profile.ftl b/login/register-user-profile.ftl
new file mode 100755
index 0000000..5550d6d
--- /dev/null
+++ b/login/register-user-profile.ftl
@@ -0,0 +1,62 @@
+<#import "template.ftl" as layout>
+<#import "user-profile-commons.ftl" as userProfileCommons>
+<@layout.registrationLayout displayMessage=messagesPerField.exists('global') displayRequiredFields=true; section>
+ <#if section = "header">
+ ${msg("registerTitle")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/register.ftl b/login/register.ftl
new file mode 100755
index 0000000..62e1eb1
--- /dev/null
+++ b/login/register.ftl
@@ -0,0 +1,112 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('firstName','lastName','email','username','password','password-confirm'); section>
+ <#if section = "header">
+ ${msg("registerTitle")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/saml-post-form.ftl b/login/saml-post-form.ftl
new file mode 100644
index 0000000..94b0c30
--- /dev/null
+++ b/login/saml-post-form.ftl
@@ -0,0 +1,25 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+ <#if section = "header">
+ ${msg("saml.post-form.title")}
+ <#elseif section = "form">
+
+ ${msg("saml.post-form.message")}
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/select-authenticator.ftl b/login/select-authenticator.ftl
new file mode 100644
index 0000000..3a73174
--- /dev/null
+++ b/login/select-authenticator.ftl
@@ -0,0 +1,43 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayInfo=false; section>
+ <#if section = "header" || section = "show-username">
+
+ <#if section = "header">
+ ${msg("loginChooseAuthenticator")}
+ #if>
+ <#elseif section = "form">
+
+
+
+ #if>
+@layout.registrationLayout>
+
diff --git a/login/terms.ftl b/login/terms.ftl
new file mode 100755
index 0000000..687b192
--- /dev/null
+++ b/login/terms.ftl
@@ -0,0 +1,15 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=false; section>
+ <#if section = "header">
+ ${msg("termsTitle")}
+ <#elseif section = "form">
+
+ ${kcSanitize(msg("termsText"))?no_esc}
+
+
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/theme.properties b/login/theme.properties
index c2074dd..33f9bb6 100644
--- a/login/theme.properties
+++ b/login/theme.properties
@@ -3,6 +3,8 @@ import=common/pub.solar
styles=
+kcInputClass=ps-input
+
kcButtonClass=ps-button
kcButtonPrimaryClass=ps-button_primary
kcButtonLargeClass=ps-button_large
diff --git a/login/update-email.ftl b/login/update-email.ftl
new file mode 100644
index 0000000..4c85e5b
--- /dev/null
+++ b/login/update-email.ftl
@@ -0,0 +1,42 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('email'); section>
+ <#if section = "header">
+ ${msg("updateEmailTitle")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
diff --git a/login/update-user-profile.ftl b/login/update-user-profile.ftl
new file mode 100755
index 0000000..e09f5c3
--- /dev/null
+++ b/login/update-user-profile.ftl
@@ -0,0 +1,28 @@
+<#import "template.ftl" as layout>
+<#import "user-profile-commons.ftl" as userProfileCommons>
+<@layout.registrationLayout displayMessage=messagesPerField.exists('global') displayRequiredFields=true; section>
+ <#if section = "header">
+ ${msg("loginProfileTitle")}
+ <#elseif section = "form">
+
+ #if>
+@layout.registrationLayout>
\ No newline at end of file
diff --git a/login/user-profile-commons.ftl b/login/user-profile-commons.ftl
new file mode 100644
index 0000000..140eea3
--- /dev/null
+++ b/login/user-profile-commons.ftl
@@ -0,0 +1,187 @@
+<#macro userProfileFormFields>
+ <#assign currentGroup="">
+
+ <#list profile.attributes as attribute>
+
+ <#assign groupName = attribute.group!"">
+ <#if groupName != currentGroup>
+ <#assign currentGroup=groupName>
+ <#if currentGroup != "" >
+
+ #if>
+ #if>
+
+ <#nested "beforeField" attribute>
+
+ <#nested "afterField" attribute>
+ #list>
+#macro>
+
+<#macro inputFieldByType attribute>
+ <#switch attribute.annotations.inputType!''>
+ <#case 'textarea'>
+ <@textareaTag attribute=attribute/>
+ <#break>
+ <#case 'select'>
+ <#case 'multiselect'>
+ <@selectTag attribute=attribute/>
+ <#break>
+ <#case 'select-radiobuttons'>
+ <#case 'multiselect-checkboxes'>
+ <@inputTagSelects attribute=attribute/>
+ <#break>
+ <#default>
+ <@inputTag attribute=attribute/>
+ #switch>
+#macro>
+
+<#macro inputTag attribute>
+ disabled#if>
+ <#if attribute.autocomplete??>autocomplete="${attribute.autocomplete}"#if>
+ <#if attribute.annotations.inputTypePlaceholder??>placeholder="${attribute.annotations.inputTypePlaceholder}"#if>
+ <#if attribute.annotations.inputTypePattern??>pattern="${attribute.annotations.inputTypePattern}"#if>
+ <#if attribute.annotations.inputTypeSize??>size="${attribute.annotations.inputTypeSize}"#if>
+ <#if attribute.annotations.inputTypeMaxlength??>maxlength="${attribute.annotations.inputTypeMaxlength}"#if>
+ <#if attribute.annotations.inputTypeMinlength??>minlength="${attribute.annotations.inputTypeMinlength}"#if>
+ <#if attribute.annotations.inputTypeMax??>max="${attribute.annotations.inputTypeMax}"#if>
+ <#if attribute.annotations.inputTypeMin??>min="${attribute.annotations.inputTypeMin}"#if>
+ <#if attribute.annotations.inputTypeStep??>step="${attribute.annotations.inputTypeStep}"#if>
+ />
+#macro>
+
+<#macro inputTagType attribute>
+ <#compress>
+ <#if attribute.annotations.inputType??>
+ <#if attribute.annotations.inputType?starts_with("html5-")>
+ ${attribute.annotations.inputType[6..]}
+ <#else>
+ ${attribute.annotations.inputType}
+ #if>
+ <#else>
+ text
+ #if>
+ #compress>
+#macro>
+
+<#macro textareaTag attribute>
+
+#macro>
+
+<#macro selectTag attribute>
+
+#macro>
+
+<#macro inputTagSelects attribute>
+ <#if attribute.annotations.inputType=='select-radiobuttons'>
+ <#assign inputType='radio'>
+ <#assign classDiv=properties.kcInputClassRadio!>
+ <#assign classInput=properties.kcInputClassRadioInput!>
+ <#assign classLabel=properties.kcInputClassRadioLabel!>
+ <#else>
+ <#assign inputType='checkbox'>
+ <#assign classDiv=properties.kcInputClassCheckbox!>
+ <#assign classInput=properties.kcInputClassCheckboxInput!>
+ <#assign classLabel=properties.kcInputClassCheckboxLabel!>
+ #if>
+
+ <#if attribute.annotations.inputOptionsFromValidation?? && attribute.validators[attribute.annotations.inputOptionsFromValidation]?? && attribute.validators[attribute.annotations.inputOptionsFromValidation].options??>
+ <#assign options=attribute.validators[attribute.annotations.inputOptionsFromValidation].options>
+ <#elseif attribute.validators.options?? && attribute.validators.options.options??>
+ <#assign options=attribute.validators.options.options>
+ #if>
+
+ <#if options??>
+ <#list options as option>
+
+ disabled#if>
+ <#if attribute.values?seq_contains(option)>checked#if>
+ />
+
+
+ #list>
+ #if>
+
+#macro>
+
+<#macro selectOptionLabelText attribute option>
+ <#compress>
+ <#if attribute.annotations.inputOptionLabels??>
+ ${advancedMsg(attribute.annotations.inputOptionLabels[option]!option)}
+ <#else>
+ <#if attribute.annotations.inputOptionLabelsI18nPrefix??>
+ ${msg(attribute.annotations.inputOptionLabelsI18nPrefix + '.' + option)}
+ <#else>
+ ${option}
+ #if>
+ #if>
+ #compress>
+#macro>
\ No newline at end of file
diff --git a/login/webauthn-authenticate.ftl b/login/webauthn-authenticate.ftl
new file mode 100644
index 0000000..a07f750
--- /dev/null
+++ b/login/webauthn-authenticate.ftl
@@ -0,0 +1,168 @@
+ <#import "template.ftl" as layout>
+ <@layout.registrationLayout; section>
+ <#if section = "title">
+ title
+ <#elseif section = "header">
+ ${kcSanitize(msg("webauthn-login-title"))?no_esc}
+ <#elseif section = "form">
+
+
+
+
+
+ <#elseif section = "info">
+
+ #if>
+ @layout.registrationLayout>
diff --git a/login/webauthn-error.ftl b/login/webauthn-error.ftl
new file mode 100644
index 0000000..2474a3f
--- /dev/null
+++ b/login/webauthn-error.ftl
@@ -0,0 +1,36 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=true; section>
+ <#if section = "header">
+ ${kcSanitize(msg("webauthn-error-title"))?no_esc}
+ <#elseif section = "form">
+
+
+
+
+
+
+
+ <#if isAppInitiatedAction??>
+
+ #if>
+
+ #if>
+@layout.registrationLayout>
\ No newline at end of file
diff --git a/login/webauthn-register.ftl b/login/webauthn-register.ftl
new file mode 100644
index 0000000..1beb31e
--- /dev/null
+++ b/login/webauthn-register.ftl
@@ -0,0 +1,197 @@
+ <#import "template.ftl" as layout>
+ <@layout.registrationLayout; section>
+ <#if section = "title">
+ title
+ <#elseif section = "header">
+
+ ${kcSanitize(msg("webauthn-registration-title"))?no_esc}
+ <#elseif section = "form">
+
+
+
+
+
+
+ ${msg("doRegister")}
+
+ <#if !isSetRetry?has_content && isAppInitiatedAction?has_content>
+
+ #if>
+
+ #if>
+ @layout.registrationLayout>
|