diff --git a/.gitignore b/.gitignore
index f9040d01e7d96fca71bb309c9f6ce54365edde4b..06c4b5fc27798fc616791d310a300646b350c8e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ __pycache__/
 data/
 db.db
 report.csv
+.env
\ No newline at end of file
diff --git a/keycloak-theme/themes/README.md b/keycloak-theme/themes/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..bf00bb8c52e637ffc8685559ad2cf8d9de685c2a
--- /dev/null
+++ b/keycloak-theme/themes/README.md
@@ -0,0 +1,91 @@
+## Keycloak Custom Login Theme Explanation
+
+This document provides a breakdown of a custom Keycloak login theme using the FreeMarker template engine.
+
+### 1. **Import Directive**:
+
+```ftl
+<#import "template.ftl" as layout> ```
+
+This imports the template.ftl to be used in the current template and assigns it an alias layout.
+
+### 2. **Layout Structure**
+
+```<@layout.registrationLayout ...>
+    ...
+</@layout.registrationLayout>
+```
+
+### 3. **Sections**
+
+1. Header
+
+Displays a message (title) for the account login.
+
+2. Form 
+
+This section contains the main login form:
+
+If password-based authentication is enabled (realm.password), it will display fields for username (or email) and password.
+There are error handling mechanisms in place to display messages if there are issues with the provided username or password.
+The form also has a "Remember Me" checkbox and a link for resetting a forgotten password.
+
+3. Info
+
+Displays a message for users who don't have an account, giving them an option to register.
+
+4. SocialProviders
+
+f password authentication and social providers are enabled and available, it displays a dropdown for users to choose a social provider to log in with.
+The dropdown uses the Select2 library for enhanced UX, and on selecting a social provider, the user is redirected to its login URL.
+
+### 4. **Resources**
+
+The template imports CSS and JS resources from the web, specifically:
+
+jQuery (used widely for JavaScript operations)
+Select2 library (to enhance the dropdown experience)
+
+### 5. **Custom CSS**
+
+Some inline styles are applied, especially related to width adjustments for the social providers' dropdown.
+
+### 6. **Custom JavaScript**
+
+There's a JavaScript section that initializes the Select2 dropdown and sets an event listener
+
+
+## Keycloak Theme Management Script
+
+This script helps manage themes in a Keycloak Docker container. Specifically, it imports a theme from your host to the container and then restarts the container.
+
+### How To Use
+
+1. **Set the Container Name:**
+
+   First, replace `your_keycloak_container_name` with your actual Keycloak container's name:
+
+    ```export DOCKER_KEYCLOAK_CONTAINER_NAME=your_keycloak_container_name```
+
+
+
+2. **Copy Theme to Container:**
+
+Use the following command to copy the `gitsearch` theme from a local directory on your host to the Keycloak container:
+
+    ```docker cp keycloak-theme/themes/gitsearch/. $DOCKER_KEYCLOAK_CONTAINER_NAME:opt/jboss/keycloak/themes/gitsearch```
+
+
+
+3. **Restart the Container:**
+
+After copying the theme, restart the Keycloak container for changes to take effect:
+
+    ```docker restart $DOCKER_KEYCLOAK_CONTAINER_NAME```
+
+
+4. **Monitor Container Logs:**
+
+If you wish to monitor the logs of the Keycloak container in real-time:
+
+    ```docker logs -f $DOCKER_KEYCLOAK_CONTAINER_NAME```
\ No newline at end of file
diff --git a/keycloak-theme/themes/deploy_theme.sh b/keycloak-theme/themes/deploy_theme.sh
new file mode 100755
index 0000000000000000000000000000000000000000..216fb2fa41e0d9a620d980168987093c41178a28
--- /dev/null
+++ b/keycloak-theme/themes/deploy_theme.sh
@@ -0,0 +1,7 @@
+export DOCKER_KEYCLOAK_CONTAINER_NAME=your_keycloak_container_name
+
+docker cp keycloak-theme/themes/gitsearch/. $DOCKER_KEYCLOAK_CONTAINER_NAME:opt/jboss/keycloak/themes/gitsearch
+
+docker restart $DOCKER_KEYCLOAK_CONTAINER_NAME
+docker logs $DOCKER_KEYCLOAK_CONTAINER_NAME --follow 
+
diff --git a/keycloak-theme/themes/gitsearch/login/login.ftl b/keycloak-theme/themes/gitsearch/login/login.ftl
new file mode 100644
index 0000000000000000000000000000000000000000..114836a419eb1199f9644fa4b8ebd3f7ab6a0e59
--- /dev/null
+++ b/keycloak-theme/themes/gitsearch/login/login.ftl
@@ -0,0 +1,114 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout displayMessage=!messagesPerField.existsError('username','password') displayInfo=realm.password && realm.registrationAllowed && !registrationDisabled??; section>
+    <#if section = "header">
+        ${msg("loginAccountTitle")}
+    <#elseif section = "form">
+    <div id="kc-form" style="display:none">
+      <div id="kc-form-wrapper">
+              <hr/>
+        <h4>${msg("identity-provider-login-label")}</h4>
+        <#if realm.password>
+            <form id="kc-form-login" onsubmit="login.disabled = true; return true;" action="${url.loginAction}" method="post">
+                <#if !usernameHidden??>
+                    <div class="${properties.kcFormGroupClass!}">
+                        <label for="username" class="${properties.kcLabelClass!}"><#if !realm.loginWithEmailAllowed>${msg("username")}<#elseif !realm.registrationEmailAsUsername>${msg("usernameOrEmail")}<#else>${msg("email")}</#if></label>
+
+                        <input tabindex="1" id="username" class="${properties.kcInputClass!}" name="username" value="${(login.username!'')}"  type="text" autofocus autocomplete="off"
+                               aria-invalid="<#if messagesPerField.existsError('username','password')>true</#if>"
+                        />
+
+                        <#if messagesPerField.existsError('username','password')>
+                            <span id="input-error" class="${properties.kcInputErrorMessageClass!}" aria-live="polite">
+                                    ${kcSanitize(messagesPerField.getFirstError('username','password'))?no_esc}
+                            </span>
+                        </#if>
+
+                    </div>
+                </#if>
+
+                <div class="${properties.kcFormGroupClass!}">
+                    <label for="password" class="${properties.kcLabelClass!}">${msg("password")}</label>
+
+                    <input tabindex="2" id="password" class="${properties.kcInputClass!}" name="password" type="password" autocomplete="off"
+                           aria-invalid="<#if messagesPerField.existsError('username','password')>true</#if>"
+                    />
+
+                    <#if usernameHidden?? && messagesPerField.existsError('username','password')>
+                        <span id="input-error" class="${properties.kcInputErrorMessageClass!}" aria-live="polite">
+                                ${kcSanitize(messagesPerField.getFirstError('username','password'))?no_esc}
+                        </span>
+                    </#if>
+
+                </div>
+
+                <div class="${properties.kcFormGroupClass!} ${properties.kcFormSettingClass!}">
+                    <div id="kc-form-options">
+                        <#if realm.rememberMe && !usernameHidden??>
+                            <div class="checkbox">
+                                <label>
+                                    <#if login.rememberMe??>
+                                        <input tabindex="3" id="rememberMe" name="rememberMe" type="checkbox" checked> ${msg("rememberMe")}
+                                    <#else>
+                                        <input tabindex="3" id="rememberMe" name="rememberMe" type="checkbox"> ${msg("rememberMe")}
+                                    </#if>
+                                </label>
+                            </div>
+                        </#if>
+                        </div>
+                        <div class="${properties.kcFormOptionsWrapperClass!}">
+                            <#if realm.resetPasswordAllowed>
+                                <span><a tabindex="5" href="${url.loginResetCredentialsUrl}">${msg("doForgotPassword")}</a></span>
+                            </#if>
+                        </div>
+
+                  </div>
+
+                  <div id="kc-form-buttons" class="${properties.kcFormGroupClass!}">
+                      <input type="hidden" id="id-hidden-input" name="credentialId" <#if auth.selectedCredential?has_content>value="${auth.selectedCredential}"</#if>/>
+                      <input tabindex="4" class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}" name="login" id="kc-login" type="submit" value="${msg("doLogIn")}"/>
+                  </div>
+            </form>
+        </#if>
+        </div>
+
+    </div>
+    <#elseif section = "info" >
+        <#if realm.password && realm.registrationAllowed && !registrationDisabled??>
+            <div id="kc-registration-container">
+                <div id="kc-registration">
+                    <span>${msg("noAccount")} <a tabindex="6"
+                                                 href="${url.registrationUrl}">${msg("doRegister")}</a></span>
+                </div>
+            </div>
+        </#if>
+    <#elseif section = "socialProviders" >
+        <#if realm.password && social.providers?? && social.providers?size gt 0>
+            <div id="kc-social-providers" class="${properties.kcFormSocialAccountSectionClass!}">
+                <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
+                <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
+                <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
+                <style>
+                    #social-providers-dropdown {
+                        width: 300px!important; /* You can set this value based on your layout needs */
+                    }
+                </style>
+                <select id="social-providers-dropdown" class="${properties.kcFormSocialAccountListClass!} select2-dropdown">
+                    <option style="width: 300px!important;" selected>${msg("listTitle")}</option>
+                    <#list social.providers?sort_by("displayName") as p>
+                        <option style="width: 300px!important;" value="${p.loginUrl}">${p.displayName!}</option>
+                    </#list>
+                </select>
+
+                <script type="text/javascript">
+                    $(document).ready(function() {
+                        $('.select2-dropdown').select2();
+                        $('#social-providers-dropdown').on('select2:select', function (e) {
+                            window.location.href = e.params.data.id;
+                        });
+                    });
+                </script>
+            </div>
+        </#if>
+    </#if>
+
+</@layout.registrationLayout>
diff --git a/keycloak-theme/themes/gitsearch/login/messages/messages_de.properties b/keycloak-theme/themes/gitsearch/login/messages/messages_de.properties
new file mode 100644
index 0000000000000000000000000000000000000000..9e88173fbd304d0315878714ef26dd163b266abf
--- /dev/null
+++ b/keycloak-theme/themes/gitsearch/login/messages/messages_de.properties
@@ -0,0 +1,381 @@
+doLogIn=Anmelden
+doRegister=Registrieren
+doCancel=Abbrechen
+doSubmit=Absenden
+doBack=Zur\u00FCck
+doYes=Ja
+doNo=Nein
+doContinue=Weiter
+doIgnore=Ignorieren
+doAccept=Annehmen
+doDecline=Ablehnen
+doForgotPassword=Passwort vergessen?
+doClickHere=Hier klicken
+doImpersonate=Identit\u00E4tswechsel
+doTryAgain=Erneut versuchen
+doTryAnotherWay=Einen anderen Weg versuchen
+doConfirmDelete=L\u00F6schung best\u00E4tigen
+errorDeletingAccount=Beim L\u00F6schen des Kontos ist ein Fehler aufgetreten
+deletingAccountForbidden=Sie haben nicht gen\u00FCgend Berechtigungen, um Ihr eigenes Konto zu l\u00F6schen, wenden Sie sich an einen Administrator.
+kerberosNotConfigured=Kerberos ist nicht konfiguriert.
+kerberosNotConfiguredTitle=Kerberos nicht konfiguriert
+bypassKerberosDetail=Sie sind entweder nicht mit Kerberos angemeldet, oder Ihr Browser ist nicht f\u00FCr eine Anmeldung mit Kerberos konfiguriert. Bitte klicken Sie auf Weiter, damit Sie sich auf eine andere Art anmelden k\u00F6nnen
+kerberosNotSetUp=Kerberos ist nicht konfiguriert. Sie k\u00F6nnen sich damit nicht anmelden.
+registerTitle=Registrierung
+loginAccountTitle=W\u00E4hlen sie eine Login-Methode
+listTitle="Liste \u00F6ffnen"
+loginTitle=Anmeldung bei {0}
+loginTitleHtml={0}
+impersonateTitle={0} Identit\u00E4tswechsel
+impersonateTitleHtml=<strong>{0}</strong> Identit\u00E4tswechsel
+realmChoice=Realm
+unknownUser=Unbekannter Benutzer
+loginTotpTitle=Mehrfachauthentifizierung konfigurieren
+loginProfileTitle=Benutzerkonto Informationen aktualisieren
+loginTimeout=Sie haben zu lange gebraucht, um sich anzumelden. Bitte versuchen Sie es erneut.
+oauthGrantTitle=OAuth gew\u00E4hren
+oauthGrantTitleHtml={0}
+errorTitle=Es ist ein Fehler aufgetreten.
+errorTitleHtml=Es ist ein Fehler aufgetreten.
+emailVerifyTitle=E-Mail verifizieren
+emailForgotTitle=Passwort vergessen?
+updatePasswordTitle=Passwort aktualisieren
+codeSuccessTitle=Erfolgreicher Code
+codeErrorTitle=Fehlercode\: {0}
+displayUnsupported=Angeforderter Anzeigetyp wird nicht unterst\u00FCtzt
+browserRequired=Browser f\u00FCr die Anmeldung erforderlich
+browserContinue=Browser erforderlich, um die Anmeldung abzuschlie\u00DFen
+browserContinuePrompt=Browser \u00F6ffnen und Anmeldung fortsetzen? [y/n]:
+browserContinueAnswer=y
+
+
+termsTitle=Bedingungen und Konditionen
+termsTitleHtml=Bedingungen und Konditionen
+termsText=<p>Zu definierende Bedingungen und Konditionen</p>
+
+recaptchaFailed=Ung\u00FCltiges Recaptcha
+recaptchaNotConfigured=Recaptcha Eingabe ist erforderlich, jedoch noch nicht konfiguriert.
+consentDenied=Zustimmung verweigert.
+
+noAccount=Neuer Benutzer?
+username=Benutzername
+usernameOrEmail=Benutzername oder E-Mail
+firstName=Vorname
+givenName=Vorname
+fullName=Voller Name
+lastName=Nachname
+familyName=Nachname
+email=E-Mail
+password=Passwort
+passwordConfirm=Passwort best\u00E4tigen
+passwordNew=Neues Passwort
+passwordNewConfirm=Neues Passwort best\u00E4tigen
+rememberMe=Angemeldet bleiben
+authenticatorCode=One-time Code
+address=Adresse
+street=Stra\u00DFe
+locality=Stadt oder Ortschaft
+region=Staat, Provinz, Region
+postal_code=PLZ
+country=Land
+emailVerified=E-Mail verifiziert
+website=Website
+phoneNumber=Telefonnummer
+phoneNumberVerified=Telefonnummer verifiziert
+gender=Geschlecht
+birthday=Geburtsdatum
+zoneinfo=Zeitzone
+gssDelegationCredential=GSS delegierte Berechtigung
+logoutOtherSessions=Von anderen Ger\u00E4ten abmelden
+
+profileScopeConsentText=Nutzerkonto
+emailScopeConsentText=E-Mail Adresse
+addressScopeConsentText=Adresse
+phoneScopeConsentText=Telefonnummer
+offlineAccessScopeConsentText=Offline Zugriff
+samlRoleListScopeConsentText=Meine Rollen
+rolesScopeConsentText=Nutzerrollen
+
+restartLoginTooltip=Login neustarten
+
+loginTotpIntro=Sie m\u00FCssen einen One Time Passwort-Generator einrichten, um auf dieses Konto zugreifen zu k\u00F6nnen.
+loginTotpStep1=Installieren Sie eine der folgenden Applikationen auf Ihrem Smartphone:
+loginTotpStep2=\u00D6ffnen Sie die Applikation und scannen Sie den Barcode.
+loginTotpStep3=Geben Sie den von der Applikation generierten One-time Code ein und klicken Sie auf Speichern.
+loginTotpStep3DeviceName=Geben Sie einen Ger\u00E4tenamen an, um die Verwaltung Ihrer OTP-Ger\u00E4te zu erleichtern.
+loginTotpManualStep2=\u00D6ffnen Sie die Applikation und geben Sie den folgenden Schl\u00FCssel ein.
+loginTotpManualStep3=Verwenden Sie die folgenden Konfigurationswerte, falls Sie diese f\u00FCr die Applikation anpassen k\u00F6nnen:
+loginTotpUnableToScan=Sie k\u00F6nnen den Barcode nicht scannen?
+loginTotpScanBarcode=Barcode scannen?
+loginCredential=Anmeldeinformation
+loginOtpOneTime=One-time code
+loginTotpType=Typ
+loginTotpAlgorithm=Algorithmus
+loginTotpDigits=Ziffern
+loginTotpInterval=Intervall
+loginTotpCounter=Z\u00E4hler
+loginTotpDeviceName=Ger\u00E4tename
+
+loginTotp.totp=zeitbasiert (time-based)
+loginTotp.hotp=z\u00E4hlerbasiert (counter-based)
+
+loginChooseAuthenticator=Login Methode ausw\u00E4hlen
+
+oauthGrantRequest=Wollen Sie diese Zugriffsrechte gew\u00E4hren?
+inResource=in
+
+emailVerifyInstruction1=Eine E-Mail mit weiteren Anweisungen wurde an Sie versendet.
+emailVerifyInstruction2=Falls Sie keine E-Mail erhalten haben, dann k\u00F6nnen Sie
+emailVerifyInstruction3=um eine neue E-Mail versenden zu lassen.
+
+emailLinkIdpTitle={0} verkn\u00FCpfen
+emailLinkIdp1=Eine E-Mail mit weiteren Anweisungen um {0} Konto {1} mit Ihrem {2} Konto zu verkn\u00FCpfen wurde an Sie versendet.
+emailLinkIdp2=Sie haben keinen Code in Ihrer E-Mail erhalten?
+emailLinkIdp3=um eine neue E-Mail versenden zu lassen.
+emailLinkIdp4=Wenn Sie die E-Mail bereits in einem anderen Browser verifiziert haben
+emailLinkIdp5=um fortzufahren.
+
+backToLogin=&laquo; Zur\u00FCck zur Anmeldung
+
+emailInstruction=Geben Sie Ihren Benutzernamen oder Ihre E-Mail Adresse ein und klicken Sie auf Absenden. Danach werden wir Ihnen eine E-Mail mit weiteren Instruktionen zusenden.
+
+copyCodeInstruction=Bitte kopieren Sie den folgenden Code und f\u00FCgen ihn in die Applikation ein\:
+
+pageExpiredTitle=Diese Seite ist nicht mehr g\u00FCltig.
+pageExpiredMsg1=Um den Anmeldevorgang neu zu starten
+pageExpiredMsg2=Um den Anmeldevorgang fortzusetzen
+
+personalInfo=Pers\u00F6nliche Informationen:
+role_admin=Admin
+role_realm-admin=Realm Admin
+role_create-realm=Realm erstellen
+role_create-client=Client erstellen
+role_view-realm=Realm ansehen
+role_view-users=Benutzer ansehen
+role_view-applications=Applikationen ansehen
+role_view-clients=Clients ansehen
+role_view-events=Events ansehen
+role_view-identity-providers=Identity Provider ansehen
+role_manage-realm=Realm verwalten
+role_manage-users=Benutzer verwalten
+role_manage-applications=Applikationen verwalten
+role_manage-identity-providers=Identity Provider verwalten
+role_manage-clients=Clients verwalten
+role_manage-events=Events verwalten
+role_view-profile=Profile ansehen
+role_manage-account=Profile verwalten
+role_manage-account-links=Profil-Links verwalten
+role_read-token=Token lesen
+role_offline-access=Offline-Zugriff
+client_account=Clientkonto
+client_account-console=Accountkonsole
+client_security-admin-console=Security Adminkonsole
+client_admin-cli=Admin CLI
+client_realm-management=Realm-Management
+client_broker=Broker
+
+requiredFields=Ben\u00F6tigte Felder
+
+invalidUserMessage=Ung\u00FCltiger Benutzername oder Passwort.
+invalidUsernameMessage=Ung\u00FCltiger Benutzername.
+invalidUsernameOrEmailMessage=Ung\u00FCltiger Benutzername oder E-Mail.
+invalidPasswordMessage=Ung\u00FCltiges Passwort.
+invalidEmailMessage=Ung\u00FCltige E-Mail-Adresse.
+accountDisabledMessage=Ihr Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin.
+accountTemporarilyDisabledMessage=Ihr Benutzerkonto ist tempor\u00E4r gesperrt. Bitte kontaktieren Sie den Admin oder versuchen Sie es sp\u00E4ter noch einmal.
+expiredCodeMessage=Zeit\u00FCberschreitung bei der Anmeldung. Bitte melden Sie sich erneut an.
+expiredActionMessage=Die Aktion ist nicht mehr g\u00FCltig. Bitte fahren Sie nun mit der Anmeldung fort.
+expiredActionTokenNoSessionMessage=Die Aktion ist nicht mehr g\u00FCltig.
+expiredActionTokenSessionExistsMessage=Die Aktion ist nicht mehr g\u00FCltig. Bitte fangen Sie noch einmal an.
+
+missingFirstNameMessage=Bitte geben Sie einen Vornamen ein.
+missingLastNameMessage=Bitte geben Sie einen Nachnamen ein.
+missingEmailMessage=Bitte geben Sie eine E-Mail-Adresse ein.
+missingUsernameMessage=Bitte geben Sie einen Benutzernamen ein.
+missingPasswordMessage=Bitte geben Sie ein Passwort ein.
+missingTotpMessage=Bitte geben Sie den One-time Code ein.
+missingTotpDeviceNameMessage=Bitte geben Sie einen Ger\u00E4tenamen ein.
+notMatchPasswordMessage=Passw\u00F6rter sind nicht identisch.
+
+invalidPasswordExistingMessage=Das aktuelle Passwort ist ung\u00FCltig.
+invalidPasswordBlacklistedMessage=Ung\u00FCltiges Passwort: Das Passwort steht auf der Blockliste (schwarzen Liste).
+invalidPasswordConfirmMessage=Die Passwortbest\u00E4tigung ist nicht identisch.
+invalidTotpMessage=Ung\u00FCltiger One-time Code.
+
+usernameExistsMessage=Benutzername existiert bereits.
+emailExistsMessage=E-Mail existiert bereits.
+
+federatedIdentityExistsMessage=Ein Benutzer mit {0} {1} existiert bereits. Bitte melden Sie sich an der Benutzerkontoverwaltung an um den Benutzer zu verkn\u00FCpfen.
+
+confirmLinkIdpTitle=Das Benutzerkonto existiert bereits.
+federatedIdentityConfirmLinkMessage=Ein Benutzer mit {0} {1} existiert bereits. Wie m\u00F6chten Sie fortfahren?
+federatedIdentityConfirmReauthenticateMessage=Anmelden um das Benutzerkonto mit {0} zu verkn\u00FCpfen
+nestedFirstBrokerFlowMessage=Der {0} Benutzer {1} ist mit keinem bekannten Benutzer verkn\u00FCpfen.
+confirmLinkIdpReviewProfile=Benutzerkonto \u00FCberpr\u00FCfen
+confirmLinkIdpContinue=Zu einem bestehenden Benutzerkonto hinzuf\u00FCgen
+
+configureTotpMessage=Sie m\u00FCssen eine Mehrfachauthentifizierung einrichten, um das Benutzerkonto zu aktivieren.
+updateProfileMessage=Sie m\u00FCssen Ihr Benutzerkonto aktualisieren, um das Benutzerkonto zu aktivieren.
+updatePasswordMessage=Sie m\u00FCssen Ihr Passwort \u00E4ndern, um das Benutzerkonto zu aktivieren.
+resetPasswordMessage=Sie m\u00FCssen Ihr Passwort \u00E4ndern.
+verifyEmailMessage=Sie m\u00FCssen Ihre E-Mail-Adresse verifizieren, um das Benutzerkonto zu aktivieren.
+linkIdpMessage=Sie m\u00FCssen Ihre E-Mail-Adresse verifizieren, um Ihr Benutzerkonto mit {0} zu verkn\u00FCpfen.
+
+emailSentMessage=Sie sollten in K\u00FCrze eine E-Mail mit weiteren Instruktionen erhalten.
+emailSendErrorMessage=Die E-Mail konnte nicht versendet werden. Bitte versuchen Sie es sp\u00E4ter nochmal einmal.
+
+accountUpdatedMessage=Ihr Benutzerkonto wurde aktualisiert.
+accountPasswordUpdatedMessage=Ihr Passwort wurde aktualisiert.
+
+delegationCompleteHeader=Login Erfolgreich
+delegationCompleteMessage=Sie k\u00F6nnen dieses Browserfenster schlie\u00DFen und zu Ihrer Konsolenanwendung zur\u00FCckkehren.
+delegationFailedHeader=Login Fehlgeschlagen
+delegationFailedMessage=Sie k\u00F6nnen dieses Browserfenster schlie\u00DFen und zu Ihrer Konsolenanwendung zur\u00FCckkehren und versuchen, sich erneut anzumelden.
+
+noAccessMessage=Kein Zugriff
+
+invalidPasswordMinLengthMessage=Ung\u00FCltiges Passwort: Es muss mindestens {0} Zeichen lang sein.
+invalidPasswordMinDigitsMessage=Ung\u00FCltiges Passwort: Es muss mindestens {0} Zahl(en) beinhalten.
+invalidPasswordMinLowerCaseCharsMessage=Ung\u00FCltiges Passwort\: Es muss mindestens {0} Kleinbuchstaben beinhalten.
+invalidPasswordMinUpperCaseCharsMessage=Ung\u00FCltiges Passwort: Es muss mindestens {0} Gro\u00DFbuchstaben beinhalten.
+invalidPasswordMinSpecialCharsMessage=Ung\u00FCltiges Passwort: Es muss mindestens {0} Sonderzeichen beinhalten.
+invalidPasswordNotUsernameMessage=Ung\u00FCltiges Passwort: Es darf nicht gleich sein wie der Benutzername.
+invalidPasswordNotEmailMessage=Ung\u00FCltiges Passwort: darf nicht identisch mit der E-Mail-Adresse sein.
+invalidPasswordRegexPatternMessage=Ung\u00FCltiges Passwort: Es entspricht nicht dem Regex-Muster.
+invalidPasswordHistoryMessage=Ung\u00FCltiges Passwort: Es darf nicht einem der letzten {0} Passw\u00F6rter entsprechen.
+invalidPasswordGenericMessage=Ung\u00FCltiges Passwort: Es verletzt die Passwort-Richtlinien.
+
+failedToProcessResponseMessage=Konnte Antwort nicht verarbeiten.
+httpsRequiredMessage=HTTPS erforderlich.
+realmNotEnabledMessage=Realm nicht aktiviert.
+invalidRequestMessage=Ung\u00FCltiger Request.
+failedLogout=Logout fehlgeschlagen.
+unknownLoginRequesterMessage=Ung\u00FCltiger Login Requester.
+loginRequesterNotEnabledMessage=Login Requester nicht aktiviert.
+bearerOnlyMessage=Bearer-only Clients k\u00F6nnen sich nicht via Browser anmelden.
+standardFlowDisabledMessage=Client darf sich mit diesem response_type nicht via Browser anmelden. Standard Flow ist f\u00FCr diesen Client deaktiviert.
+implicitFlowDisabledMessage=Client darf sich mit diesem response_type nicht via Browser anmelden. Implicit Flow ist f\u00FCr diesen Client deaktiviert.
+invalidRedirectUriMessage=Ung\u00FCltige Redirect Uri.
+unsupportedNameIdFormatMessage=Nicht unterst\u00FCtztes NameIDFormat.
+invalidRequesterMessage=Ung\u00FCltiger Requester.
+registrationNotAllowedMessage=Registrierung nicht erlaubt.
+resetCredentialNotAllowedMessage=Reset Credential nicht erlaubt.
+
+permissionNotApprovedMessage=Berechtigung nicht best\u00E4tigt.
+noRelayStateInResponseMessage=Kein Relay State in der Antwort von Identity Provider.
+insufficientPermissionMessage=Nicht gen\u00FCgend Rechte, um die Identit\u00E4t zu verkn\u00FCpfen.
+couldNotProceedWithAuthenticationRequestMessage=Konnte die Authentifizierungsanfrage nicht weiter verarbeiten.
+couldNotObtainTokenMessage=Konnte kein Token vom Identity Provider erhalten.
+unexpectedErrorRetrievingTokenMessage=Unerwarteter Fehler w\u00E4hrend dem Empfang des Tokens vom Identity Provider.
+unexpectedErrorHandlingResponseMessage=Unerwarteter Fehler w\u00E4hrend der Bearbeitung der Antwort vom Identity Provider.
+identityProviderAuthenticationFailedMessage=Authentifizierung fehlgeschlagen. Authentifizierung mit dem Identity Provider nicht m\u00F6glich.
+couldNotSendAuthenticationRequestMessage=Konnte Authentifizierungsanfrage nicht an den Identity Provider senden.
+unexpectedErrorHandlingRequestMessage=Unerwarteter Fehler w\u00E4hrend der Bearbeitung der Anfrage an den Identity Provider.
+invalidAccessCodeMessage=Ung\u00FCltiger Access-Code.
+sessionNotActiveMessage=Session nicht aktiv.
+invalidCodeMessage=Ung\u00FCltiger Code, bitte melden Sie sich erneut \u00FCber die Applikation an.
+cookieNotFoundMessage=Cookie konnte nicht gefunden werden. Bitte stellen Sie sicher, dass Cookies in Ihrem Browser aktiviert sind.
+identityProviderUnexpectedErrorMessage=Unerwarteter Fehler w\u00E4hrend der Authentifizierung mit dem Identity Provider.
+identityProviderMissingStateMessage=Fehlender state Parameter in der Antwort vom Identit\u00E4tsanbieter.
+identityProviderNotFoundMessage=Konnte keinen Identity Provider zu der Identit\u00E4t finden.
+identityProviderLinkSuccess=Sie haben Ihre E-Mail-Adresse erfolgreich verifiziert. Bitte kehren Sie zu Ihrem urspr\u00FCnglichen Browser zur\u00FCck und fahren Sie dort mit der Anmeldung fort. 
+staleCodeMessage=Diese Seite ist nicht mehr g\u00FCltig, bitte kehren Sie zu Ihrer Applikation zur\u00FCk und melden Sie sich erneut an.
+realmSupportsNoCredentialsMessage=Realm unterst\u00FCtzt keine Credential Typen.
+credentialSetupRequired=Anmeldung nicht m\u00F6glich, Einrichtung der Anmeldeinformationen erforderlich.
+identityProviderNotUniqueMessage=Der Realm unterst\u00FCtzt mehrere Identity Provider. Es konnte kein eindeutiger Identity Provider zum Authentifizieren gew\u00E4hlt werden.
+emailVerifiedMessage=Ihre E-Mail-Adresse wurde erfolgreich verifiziert.
+staleEmailVerificationLink=Der von Ihnen angeklickte Link ist nicht mehr g\u00FCltig. Haben Sie Ihre E-Mail-Adresse eventuell bereits verifiziert?
+identityProviderAlreadyLinkedMessage=Die Identit\u00E4t welche von dem Identity Provider zur\u00FCckgegeben wurde ist bereits mit einem anderen Benutzer verkn\u00FCpft.
+confirmAccountLinking=Best\u00E4tigen Sie den Account {0} des Identity Provider {1} mit Ihrem Account zu verkn\u00FCpfen.
+confirmEmailAddressVerification=Best\u00E4tigen Sie, dass die E-Mail-Adresse {0} g\u00FCltig ist.
+confirmExecutionOfActions=F\u00FChren Sie die folgende(n) Aktion(en) aus
+
+backToApplication=&laquo; Zur\u00FCck zur Applikation
+missingParameterMessage=Fehlender Parameter\: {0}
+clientNotFoundMessage=Client nicht gefunden.
+clientDisabledMessage=Client deaktiviert.
+invalidParameterMessage=Ung\u00FCltiger Parameter\: {0}
+alreadyLoggedIn=Sie sind bereits angemeldet.
+differentUserAuthenticated=Sie sind in dieser Session bereits mit einem anderen Benutzer ''{0}'' angemeldet. Bitte melden Sie sich zuerst ab.
+brokerLinkingSessionExpired=Broker Account Linking angefordert; Ihre Session ist allerdings nicht mehr g\u00FCltig.
+proceedWithAction=&raquo; Klicken Sie hier um fortzufahren
+
+requiredAction.CONFIGURE_TOTP=Mehrfachauthentifizierung konfigurieren
+requiredAction.terms_and_conditions=Bedingungen und Konditionen
+requiredAction.UPDATE_PASSWORD=Passwort aktualisieren
+requiredAction.UPDATE_PROFILE=Profil aktualisieren
+requiredAction.VERIFY_EMAIL=E-Mail-Adresse verifizieren
+
+doX509Login=Sie werden angemeldet als\:
+clientCertificate=X509 Client Zertifikat\:
+noCertificate=[Kein Zertifikat]
+
+
+pageNotFound=Seite nicht gefunden
+internalServerError=Es ist ein interner Server-Fehler aufgetreten
+
+console-username=Benutzername:
+console-password=Passwort:
+console-otp=One Time Passwort:
+console-new-password=Neues Passwort:
+console-confirm-password=Passwort best\u00E4tigen:
+console-update-password=Eine Aktualisierung Ihres Passworts ist erforderlich.
+console-verify-email=Sie m\u00FCssen Ihre E-Mail-Adresse verifizieren.  Wir haben eine E-Mail an {0} gesendet, die einen Verifizierungscode enth\u00E4lt.  Bitte geben Sie diesen Code in das untenstehende Eingabefeld ein.
+console-email-code=E-Mail Code:
+console-accept-terms=Nutzungsbedingungen akzeptieren? [y/n]:
+console-accept=y
+
+# Openshift messages
+openshift.scope.user_info=Nutzerinformation
+openshift.scope.user_check-access=Benutzerzugriffsinformationen
+openshift.scope.user_full=Voller Zugriff
+openshift.scope.list-projects=Projekte auflisten
+
+# SAML authentication
+saml.post-form.title=Authentifizierungsumleitung
+saml.post-form.message=Sie werden weitergeleitet, bitte warten.
+saml.post-form.js-disabled=JavaScript ist deaktiviert. Wir empfehlen dringend, es zu aktivieren. Klicken Sie auf die Schaltfl\u00E4che unten, um fortzufahren. 
+
+#authenticators
+otp-display-name=Authenticator-Anwendung
+otp-help-text=Eingabe eines Verifizierungscodes aus der Authenticator-Anwendung.
+password-display-name=Passwort
+password-help-text=Melden Sie sich an, indem Sie Ihr Passwort eingeben.
+auth-username-form-display-name=Benutzername
+auth-username-form-help-text=Anmelden durch Eingabe des Benutzernamens
+auth-username-password-form-display-name=Benutzername und Passwort
+auth-username-password-form-help-text=Anmelden, indem Sie Ihren Benutzernamen und Ihr Passwort eingeben.
+
+# WebAuthn
+webauthn-display-name=Security-Token
+webauthn-help-text=Verwenden Sie Ihr Security-Token zur Anmeldung.
+webauthn-passwordless-display-name=Security-Token
+webauthn-passwordless-help-text=Verwenden Sie Ihr Security-Token zur kennwortlosen Anmeldung.
+webauthn-login-title=Security-Token Anmeldung
+webauthn-registration-title=Security-Token Registrierung
+webauthn-available-authenticators=Verf\u00FCgbare Authentifikatoren
+webauthn-unsupported-browser-text=WebAuthn wird von diesem Browser nicht unterst\u00FCtzt. Versuchen Sie es mit einem anderen oder wenden Sie sich an Ihren Administrator.
+webauthn-doAuthenticate=Anmelden mit Security-Token
+
+# WebAuthn Error
+webauthn-error-title=Security-Token Fehler
+webauthn-error-registration=Fehler beim Registrieren Ihres Security-Tokens.<br/> {0}
+webauthn-error-api-get=Fehler beim Authentifizieren mit dem Security-Token.<br/> {0}
+webauthn-error-different-user=Der erste authentifizierte Benutzer ist nicht derjenige, der durch das Security-Token authentifiziert wurde.
+webauthn-error-auth-verification=Das Ergebnis der Security-Token Authentifizierung ist ung\u00FCltig.<br/> {0}
+webauthn-error-register-verification=Das Ergebnis der Security-Token Registrierung ist ung\u00FCltig.<br/> {0}
+webauthn-error-user-not-found=Unbekannter Benutzer, der mit dem Security-Token authentifiziert wurde.
+
+# Identity provider
+identity-provider-redirector=Mit einem anderen Indentit\u00E4tsprovider verbinden
+identity-provider-login-label=Admin Login
+
+finalDeletionConfirmation=Wenn Sie Ihr Konto l\u00F6schen, kann es nicht wiederhergestellt werden. Um Ihr Konto zu behalten, klicken Sie auf Abbrechen.
+irreversibleAction=Diese Aktion ist unwiderruflich
+deleteAccountConfirm=L\u00F6schung des Kontos best\u00E4tigen
+
+deletingImplies=Die L\u00F6schung Ihres Kontos bedeutet:
+errasingData=L\u00F6schen aller Ihrer Daten
+loggingOutImmediately=Sofortige Abmeldung
+accountUnusable=Eine sp\u00E4tere Nutzung der Anwendung ist mit diesem Konto nicht mehr m\u00F6glich
+userDeletedSuccessfully=Nutzer erfolgreich gel\u00F6scht
diff --git a/keycloak-theme/themes/gitsearch/login/messages/messages_en.properties b/keycloak-theme/themes/gitsearch/login/messages/messages_en.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7d515a7596fdb05852e45b6f4c54e6719f6887d7
--- /dev/null
+++ b/keycloak-theme/themes/gitsearch/login/messages/messages_en.properties
@@ -0,0 +1,490 @@
+doLogIn=Sign In
+doRegister=Register
+doCancel=Cancel
+doSubmit=Submit
+doBack=Back
+doYes=Yes
+doNo=No
+doContinue=Continue
+doIgnore=Ignore
+doAccept=Accept
+doDecline=Decline
+doForgotPassword=Forgot Password?
+doClickHere=Click here
+doImpersonate=Impersonate
+doTryAgain=Try again
+doTryAnotherWay=Try Another Way
+doConfirmDelete=Confirm deletion
+errorDeletingAccount=Error happened while deleting account
+deletingAccountForbidden=You do not have enough permissions to delete your own account, contact admin.
+kerberosNotConfigured=Kerberos Not Configured
+kerberosNotConfiguredTitle=Kerberos Not Configured
+bypassKerberosDetail=Either you are not logged in by Kerberos or your browser is not set up for Kerberos login.  Please click continue to login in through other means
+kerberosNotSetUp=Kerberos is not set up.  You cannot login.
+registerTitle=Register
+loginAccountTitle=Choose a login method
+listTitle="Open list"
+loginTitle=Sign in to {0}
+loginTitleHtml={0}
+impersonateTitle={0} Impersonate User
+impersonateTitleHtml=<strong>{0}</strong> Impersonate User
+realmChoice=Realm
+unknownUser=Unknown user
+loginTotpTitle=Mobile Authenticator Setup
+loginProfileTitle=Update Account Information
+loginIdpReviewProfileTitle=Update Account Information
+loginTimeout=Your login attempt timed out.  Login will start from the beginning.
+reauthenticate=Please re-authenticate to continue
+oauthGrantTitle=Grant Access to {0}
+oauthGrantTitleHtml={0}
+oauthGrantInformation=Make sure you trust {0} by learning how {0} will handle your data.
+oauthGrantReview=You could review the 
+oauthGrantTos=terms of service.
+oauthGrantPolicy=privacy policy.
+errorTitle=We are sorry...
+errorTitleHtml=We are <strong>sorry</strong> ...
+emailVerifyTitle=Email verification
+emailForgotTitle=Forgot Your Password?
+updatePasswordTitle=Update password
+codeSuccessTitle=Success code
+codeErrorTitle=Error code\: {0}
+displayUnsupported=Requested display type unsupported
+browserRequired=Browser required to login
+browserContinue=Browser required to complete login
+browserContinuePrompt=Open browser and continue login? [y/n]:
+browserContinueAnswer=y
+
+# Transports
+usb=USB
+nfc=NFC
+bluetooth=Bluetooth
+internal=Internal
+unknown=Unknown
+
+termsTitle=Terms and Conditions
+termsText=<p>Terms and conditions to be defined</p>
+termsPlainText=Terms and conditions to be defined.
+
+recaptchaFailed=Invalid Recaptcha
+recaptchaNotConfigured=Recaptcha is required, but not configured
+consentDenied=Consent denied.
+
+noAccount=New user?
+username=Username
+usernameOrEmail=Username or email
+firstName=First name
+givenName=Given name
+fullName=Full name
+lastName=Last name
+familyName=Family name
+email=Email
+password=Password
+passwordConfirm=Confirm password
+passwordNew=New Password
+passwordNewConfirm=New Password confirmation
+rememberMe=Remember me
+authenticatorCode=One-time code
+address=Address
+street=Street
+locality=City or Locality
+region=State, Province, or Region
+postal_code=Zip or Postal code
+country=Country
+emailVerified=Email verified
+website=Web page
+phoneNumber=Phone number
+phoneNumberVerified=Phone number verified
+gender=Gender
+birthday=Birthdate
+zoneinfo=Time zone
+gssDelegationCredential=GSS Delegation Credential
+logoutOtherSessions=Sign out from other devices
+
+profileScopeConsentText=User profile
+emailScopeConsentText=Email address
+addressScopeConsentText=Address
+phoneScopeConsentText=Phone number
+offlineAccessScopeConsentText=Offline Access
+samlRoleListScopeConsentText=My Roles
+rolesScopeConsentText=User roles
+
+restartLoginTooltip=Restart login
+
+loginTotpIntro=You need to set up a One Time Password generator to access this account
+loginTotpStep1=Install one of the following applications on your mobile:
+loginTotpStep2=Open the application and scan the barcode:
+loginTotpStep3=Enter the one-time code provided by the application and click Submit to finish the setup.
+loginTotpStep3DeviceName=Provide a Device Name to help you manage your OTP devices.
+loginTotpManualStep2=Open the application and enter the key:
+loginTotpManualStep3=Use the following configuration values if the application allows setting them:
+loginTotpUnableToScan=Unable to scan?
+loginTotpScanBarcode=Scan barcode?
+loginCredential=Credential
+loginOtpOneTime=One-time code
+loginTotpType=Type
+loginTotpAlgorithm=Algorithm
+loginTotpDigits=Digits
+loginTotpInterval=Interval
+loginTotpCounter=Counter
+loginTotpDeviceName=Device Name
+
+loginTotp.totp=Time-based
+loginTotp.hotp=Counter-based
+
+loginChooseAuthenticator=Select login method
+
+oauthGrantRequest=Do you grant these access privileges?
+inResource=in
+
+oauth2DeviceVerificationTitle=Device Login
+verifyOAuth2DeviceUserCode=Enter the code provided by your device and click Submit
+oauth2DeviceInvalidUserCodeMessage=Invalid code, please try again.
+oauth2DeviceExpiredUserCodeMessage=The code has expired. Please go back to your device and try connecting again.
+oauth2DeviceVerificationCompleteHeader=Device Login Successful
+oauth2DeviceVerificationCompleteMessage=You may close this browser window and go back to your device.
+oauth2DeviceVerificationFailedHeader=Device Login Failed
+oauth2DeviceVerificationFailedMessage=You may close this browser window and go back to your device and try connecting again.
+oauth2DeviceConsentDeniedMessage=Consent denied for connecting the device.
+oauth2DeviceAuthorizationGrantDisabledMessage=Client is not allowed to initiate OAuth 2.0 Device Authorization Grant. The flow is disabled for the client.
+
+emailVerifyInstruction1=An email with instructions to verify your email address has been sent to your address {0}.
+emailVerifyInstruction2=Haven''t received a verification code in your email?
+emailVerifyInstruction3=to re-send the email.
+
+emailLinkIdpTitle=Link {0}
+emailLinkIdp1=An email with instructions to link {0} account {1} with your {2} account has been sent to you.
+emailLinkIdp2=Haven''t received a verification code in your email?
+emailLinkIdp3=to re-send the email.
+emailLinkIdp4=If you already verified the email in different browser
+emailLinkIdp5=to continue.
+
+backToLogin=&laquo; Back to Login
+
+emailInstruction=Enter your username or email address and we will send you instructions on how to create a new password.
+emailInstructionUsername=Enter your username and we will send you instructions on how to create a new password.
+
+copyCodeInstruction=Please copy this code and paste it into your application:
+
+pageExpiredTitle=Page has expired
+pageExpiredMsg1=To restart the login process
+pageExpiredMsg2=To continue the login process
+
+personalInfo=Personal Info:
+role_admin=Admin
+role_realm-admin=Realm Admin
+role_create-realm=Create realm
+role_create-client=Create client
+role_view-realm=View realm
+role_view-users=View users
+role_view-applications=View applications
+role_view-clients=View clients
+role_view-events=View events
+role_view-identity-providers=View identity providers
+role_manage-realm=Manage realm
+role_manage-users=Manage users
+role_manage-applications=Manage applications
+role_manage-identity-providers=Manage identity providers
+role_manage-clients=Manage clients
+role_manage-events=Manage events
+role_view-profile=View profile
+role_manage-account=Manage account
+role_manage-account-links=Manage account links
+role_read-token=Read token
+role_offline-access=Offline access
+client_account=Account
+client_account-console=Account Console
+client_security-admin-console=Security Admin Console
+client_admin-cli=Admin CLI
+client_realm-management=Realm Management
+client_broker=Broker
+
+requiredFields=Required fields
+
+invalidUserMessage=Invalid username or password.
+invalidUsernameMessage=Invalid username.
+invalidUsernameOrEmailMessage=Invalid username or email.
+invalidPasswordMessage=Invalid password.
+invalidEmailMessage=Invalid email address.
+accountDisabledMessage=Account is disabled, contact your administrator.
+accountTemporarilyDisabledMessage=Account is temporarily disabled; contact your administrator or retry later.
+expiredCodeMessage=Login timeout. Please sign in again.
+expiredActionMessage=Action expired. Please continue with login now.
+expiredActionTokenNoSessionMessage=Action expired.
+expiredActionTokenSessionExistsMessage=Action expired. Please start again.
+sessionLimitExceeded=There are too many sessions
+
+missingFirstNameMessage=Please specify first name.
+missingLastNameMessage=Please specify last name.
+missingEmailMessage=Please specify email.
+missingUsernameMessage=Please specify username.
+missingPasswordMessage=Please specify password.
+missingTotpMessage=Please specify authenticator code.
+missingTotpDeviceNameMessage=Please specify device name.
+notMatchPasswordMessage=Passwords don''t match.
+
+error-invalid-value=Invalid value.
+error-invalid-blank=Please specify value.
+error-empty=Please specify value.
+error-invalid-length=Length must be between {1} and {2}.
+error-invalid-length-too-short=Minimal length is {1}.
+error-invalid-length-too-long=Maximal length is {2}.
+error-invalid-email=Invalid email address.
+error-invalid-number=Invalid number.
+error-number-out-of-range=Number must be between {1} and {2}.
+error-number-out-of-range-too-small=Number must have minimal value of {1}.
+error-number-out-of-range-too-big=Number must have maximal value of {2}.
+error-pattern-no-match=Invalid value.
+error-invalid-uri=Invalid URL.
+error-invalid-uri-scheme=Invalid URL scheme.
+error-invalid-uri-fragment=Invalid URL fragment.
+error-user-attribute-required=Please specify this field.
+error-invalid-date=Invalid date.
+error-user-attribute-read-only=This field is read only.
+error-username-invalid-character=Value contains invalid character.
+error-person-name-invalid-character=Value contains invalid character.
+
+invalidPasswordExistingMessage=Invalid existing password.
+invalidPasswordBlacklistedMessage=Invalid password: password is blacklisted.
+invalidPasswordConfirmMessage=Password confirmation doesn''t match.
+invalidTotpMessage=Invalid authenticator code.
+
+usernameExistsMessage=Username already exists.
+emailExistsMessage=Email already exists.
+
+federatedIdentityExistsMessage=User with {0} {1} already exists. Please login to account management to link the account.
+federatedIdentityUnavailableMessage=User {0} authenticated with identity provider {1} does not exist. Please contact your administrator.
+
+confirmLinkIdpTitle=Account already exists
+federatedIdentityConfirmLinkMessage=User with {0} {1} already exists. How do you want to continue?
+federatedIdentityConfirmReauthenticateMessage=Authenticate to link your account with {0}
+nestedFirstBrokerFlowMessage=The {0} user {1} is not linked to any known user.
+confirmLinkIdpReviewProfile=Review profile
+confirmLinkIdpContinue=Add to existing account
+
+configureTotpMessage=You need to set up Mobile Authenticator to activate your account.
+configureBackupCodesMessage=You need to set up Backup Codes to activate your account.
+updateProfileMessage=You need to update your user profile to activate your account.
+updatePasswordMessage=You need to change your password to activate your account.
+resetPasswordMessage=You need to change your password.
+verifyEmailMessage=You need to verify your email address to activate your account.
+linkIdpMessage=You need to verify your email address to link your account with {0}.
+
+emailSentMessage=You should receive an email shortly with further instructions.
+emailSendErrorMessage=Failed to send email, please try again later.
+
+accountUpdatedMessage=Your account has been updated.
+accountPasswordUpdatedMessage=Your password has been updated.
+
+delegationCompleteHeader=Login Successful
+delegationCompleteMessage=You may close this browser window and go back to your console application.
+delegationFailedHeader=Login Failed
+delegationFailedMessage=You may close this browser window and go back to your console application and try logging in again.
+
+noAccessMessage=No access
+
+invalidPasswordMinLengthMessage=Invalid password: minimum length {0}.
+invalidPasswordMaxLengthMessage=Invalid password: maximum length {0}.
+invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits.
+invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters.
+invalidPasswordMinUpperCaseCharsMessage=Invalid password: must contain at least {0} upper case characters.
+invalidPasswordMinSpecialCharsMessage=Invalid password: must contain at least {0} special characters.
+invalidPasswordNotUsernameMessage=Invalid password: must not be equal to the username.
+invalidPasswordNotEmailMessage=Invalid password: must not be equal to the email.
+invalidPasswordRegexPatternMessage=Invalid password: fails to match regex pattern(s).
+invalidPasswordHistoryMessage=Invalid password: must not be equal to any of last {0} passwords.
+invalidPasswordGenericMessage=Invalid password: new password doesn''t match password policies.
+
+failedToProcessResponseMessage=Failed to process response
+httpsRequiredMessage=HTTPS required
+realmNotEnabledMessage=Realm not enabled
+invalidRequestMessage=Invalid Request
+successLogout=You are logged out
+failedLogout=Logout failed
+unknownLoginRequesterMessage=Unknown login requester
+loginRequesterNotEnabledMessage=Login requester not enabled
+bearerOnlyMessage=Bearer-only applications are not allowed to initiate browser login
+standardFlowDisabledMessage=Client is not allowed to initiate browser login with given response_type. Standard flow is disabled for the client.
+implicitFlowDisabledMessage=Client is not allowed to initiate browser login with given response_type. Implicit flow is disabled for the client.
+invalidRedirectUriMessage=Invalid redirect uri
+unsupportedNameIdFormatMessage=Unsupported NameIDFormat
+invalidRequesterMessage=Invalid requester
+registrationNotAllowedMessage=Registration not allowed
+resetCredentialNotAllowedMessage=Reset Credential not allowed
+
+permissionNotApprovedMessage=Permission not approved.
+noRelayStateInResponseMessage=No relay state in response from identity provider.
+insufficientPermissionMessage=Insufficient permissions to link identities.
+couldNotProceedWithAuthenticationRequestMessage=Could not proceed with authentication request to identity provider.
+couldNotObtainTokenMessage=Could not obtain token from identity provider.
+unexpectedErrorRetrievingTokenMessage=Unexpected error when retrieving token from identity provider.
+unexpectedErrorHandlingResponseMessage=Unexpected error when handling response from identity provider.
+identityProviderAuthenticationFailedMessage=Authentication failed. Could not authenticate with identity provider.
+couldNotSendAuthenticationRequestMessage=Could not send authentication request to identity provider.
+unexpectedErrorHandlingRequestMessage=Unexpected error when handling authentication request to identity provider.
+invalidAccessCodeMessage=Invalid access code.
+sessionNotActiveMessage=Session not active.
+invalidCodeMessage=An error occurred, please login again through your application.
+cookieNotFoundMessage=Cookie not found. Please make sure cookies are enabled in your browser.
+insufficientLevelOfAuthentication=The requested level of authentication has not been satisfied.
+identityProviderUnexpectedErrorMessage=Unexpected error when authenticating with identity provider
+identityProviderMissingStateMessage=Missing state parameter in response from identity provider.
+identityProviderNotFoundMessage=Could not find an identity provider with the identifier.
+identityProviderLinkSuccess=You successfully verified your email. Please go back to your original browser and continue there with the login.
+staleCodeMessage=This page is no longer valid, please go back to your application and sign in again
+realmSupportsNoCredentialsMessage=Realm does not support any credential type.
+credentialSetupRequired=Cannot login, credential setup required.
+identityProviderNotUniqueMessage=Realm supports multiple identity providers. Could not determine which identity provider should be used to authenticate with.
+emailVerifiedMessage=Your email address has been verified.
+staleEmailVerificationLink=The link you clicked is an old stale link and is no longer valid.  Maybe you have already verified your email.
+identityProviderAlreadyLinkedMessage=Federated identity returned by {0} is already linked to another user.
+confirmAccountLinking=Confirm linking the account {0} of identity provider {1} with your account.
+confirmEmailAddressVerification=Confirm validity of e-mail address {0}.
+confirmExecutionOfActions=Perform the following action(s)
+
+locale_ca=Catal\u00E0
+locale_cs=\u010Ce\u0161tina
+locale_da=Dansk
+locale_de=Deutsch
+locale_en=English
+locale_es=Espa\u00F1ol
+locale_fr=Fran\u00E7ais
+locale_hu=Magyar
+locale_it=Italiano
+locale_ja=\u65E5\u672C\u8A9E
+locale_lt=Lietuvi\u0173
+locale_nl=Nederlands
+locale_no=Norsk
+locale_pl=Polski
+locale_pt_BR=Portugu\u00EAs (Brasil)
+locale_pt-BR=Portugu\u00EAs (Brasil)
+locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439
+locale_sk=Sloven\u010Dina
+locale_sv=Svenska
+locale_tr=T\u00FCrk\u00E7e
+locale_zh-CN=\u4E2D\u6587\u7B80\u4F53
+locale_fi=Suomi
+
+backToApplication=&laquo; Back to Application
+missingParameterMessage=Missing parameters\: {0}
+clientNotFoundMessage=Client not found.
+clientDisabledMessage=Client disabled.
+invalidParameterMessage=Invalid parameter\: {0}
+alreadyLoggedIn=You are already logged in.
+differentUserAuthenticated=You are already authenticated as different user ''{0}'' in this session. Please sign out first.
+brokerLinkingSessionExpired=Requested broker account linking, but current session is no longer valid.
+proceedWithAction=&raquo; Click here to proceed
+acrNotFulfilled=Authentication requirements not fulfilled
+
+requiredAction.CONFIGURE_TOTP=Configure OTP
+requiredAction.terms_and_conditions=Terms and Conditions
+requiredAction.UPDATE_PASSWORD=Update Password
+requiredAction.UPDATE_PROFILE=Update Profile
+requiredAction.VERIFY_EMAIL=Verify Email
+requiredAction.CONFIGURE_RECOVERY_AUTHN_CODES=Generate Recovery Codes
+
+doX509Login=You will be logged in as\:
+clientCertificate=X509 client certificate\:
+noCertificate=[No Certificate]
+
+
+pageNotFound=Page not found
+internalServerError=An internal server error has occurred
+
+console-username=Username:
+console-password=Password:
+console-otp=One Time Password:
+console-new-password=New Password:
+console-confirm-password=Confirm Password:
+console-update-password=Update of your password is required.
+console-verify-email=You need to verify your email address.  We sent an email to {0} that contains a verification code.  Please enter this code into the input below.
+console-email-code=Email Code:
+console-accept-terms=Accept Terms? [y/n]:
+console-accept=y
+
+# Openshift messages
+openshift.scope.user_info=User information
+openshift.scope.user_check-access=User access information
+openshift.scope.user_full=Full Access
+openshift.scope.list-projects=List projects
+
+# SAML authentication
+saml.post-form.title=Authentication Redirect
+saml.post-form.message=Redirecting, please wait.
+saml.post-form.js-disabled=JavaScript is disabled. We strongly recommend to enable it. Click the button below to continue. 
+saml.artifactResolutionServiceInvalidResponse=Unable to resolve artifact.
+
+#authenticators
+otp-display-name=Authenticator Application
+otp-help-text=Enter a verification code from authenticator application.
+password-display-name=Password
+password-help-text=Sign in by entering your password.
+auth-username-form-display-name=Username
+auth-username-form-help-text=Start sign in by entering your username
+auth-username-password-form-display-name=Username and password
+auth-username-password-form-help-text=Sign in by entering your username and password.
+
+# Recovery Codes
+auth-recovery-authn-code-form-display-name=Recovery Authentication Code
+auth-recovery-authn-code-form-help-text=Enter a recovery authentication code from a previously generated list.
+auth-recovery-code-info-message=Enter the specified recovery code.
+auth-recovery-code-prompt=Recovery code #{0}
+auth-recovery-code-header=Login with a recovery authentication code
+recovery-codes-error-invalid=Invalid recovery authentication code
+recovery-code-config-header=Recovery Authentication Codes
+recovery-code-config-warning-title=These recovery codes won't appear again after leaving this page
+recovery-code-config-warning-message=Make sure to print, download, or copy them to a password manager and keep them save. Canceling this setup will remove these recovery codes from your account.
+recovery-codes-print=Print
+recovery-codes-download=Download
+recovery-codes-copy=Copy
+recovery-codes-copied=Copied
+recovery-codes-confirmation-message=I have saved these codes somewhere safe
+recovery-codes-action-complete=Complete setup
+recovery-codes-action-cancel=Cancel setup
+recovery-codes-download-file-header=Keep these recovery codes somewhere safe.
+recovery-codes-download-file-description=Recovery codes are single-use passcodes that allow you to log in to your account if you do not have access to your authenticator.
+recovery-codes-download-file-date= These codes were generated on
+recovery-codes-label-default=Recovery codes
+
+# WebAuthn
+webauthn-display-name=Security Key
+webauthn-help-text=Use your security key to sign in.
+webauthn-passwordless-display-name=Security Key
+webauthn-passwordless-help-text=Use your security key for passwordless sign in.
+webauthn-login-title=Security Key login
+webauthn-registration-title=Security Key Registration
+webauthn-available-authenticators=Available Security Keys
+webauthn-unsupported-browser-text=WebAuthn is not supported by this browser. Try another one or contact your administrator.
+webauthn-doAuthenticate=Sign in with Security Key
+webauthn-createdAt-label=Created
+
+# WebAuthn Error
+webauthn-error-title=Security Key Error
+webauthn-error-registration=Failed to register your Security key.<br/> {0}
+webauthn-error-api-get=Failed to authenticate by the Security key.<br/> {0}
+webauthn-error-different-user=First authenticated user is not the one authenticated by the Security key.
+webauthn-error-auth-verification=Security key authentication result is invalid.<br/> {0}
+webauthn-error-register-verification=Security key registration result is invalid.<br/> {0}
+webauthn-error-user-not-found=Unknown user authenticated by the Security key.
+
+# Identity provider
+identity-provider-redirector=Connect with another Identity Provider
+identity-provider-login-label=Admin login
+
+finalDeletionConfirmation=If you delete your account, it cannot be restored. To keep your account, click Cancel.
+irreversibleAction=This action is irreversible
+deleteAccountConfirm=Delete account confirmation
+
+deletingImplies=Deleting your account implies:
+errasingData=Erasing all your data
+loggingOutImmediately=Logging you out immediately
+accountUnusable=Any subsequent use of the application will not be possible with this account
+userDeletedSuccessfully=User deleted successfully
+
+access-denied=Access denied
+
+frontchannel-logout.title=Logging out
+frontchannel-logout.message=You are logging out from following apps
+logoutConfirmTitle=Logging out
+logoutConfirmHeader=Do you want to logout?
+doLogout=Logout
+
diff --git a/keycloak-theme/themes/gitsearch/login/resources/css/login.css b/keycloak-theme/themes/gitsearch/login/resources/css/login.css
new file mode 100644
index 0000000000000000000000000000000000000000..d593dc6d672d5efed5f493133489cc189f22f065
--- /dev/null
+++ b/keycloak-theme/themes/gitsearch/login/resources/css/login.css
@@ -0,0 +1,769 @@
+/* Patternfly CSS places a "bg-login.jpg" as the background on this ".login-pf" class.
+   This clashes with the "keycloak-bg.png' background defined on the body below.
+   Therefore the Patternfly background must be set to none. */
+.login-pf {
+    background: none;
+}
+
+.login-pf body {
+    background: white no-repeat center center fixed;
+    background-size: cover;
+    height: 100%;
+}
+
+/*IE compatibility*/
+.pf-c-form-control {
+    font-size: 14px;
+    font-size: var(--pf-global--FontSize--sm);
+    border-width: 1px;
+    border-width: var(--pf-global--BorderWidth--sm);;
+    border-color: #EDEDED #EDEDED #8A8D90 #EDEDED;
+    border-color: var(--pf-global--BorderColor--300) var(--pf-global--BorderColor--300) var(--pf-global--BorderColor--200) var(--pf-global--BorderColor--300);
+    background-color: #FFFFFF;
+    background-color: var(--pf-global--BackgroundColor--100);
+    height: 36px;
+    height: calc(var(--pf-c-form-control--FontSize) * var(--pf-c-form-control--LineHeight) + var(--pf-c-form-control--BorderWidth) * 2 + var(--pf-c-form-control--PaddingTop) + var(--pf-c-form-control--PaddingBottom));
+    padding: 5px 0.5rem;
+    padding: var(--pf-c-form-control--PaddingTop) var(--pf-c-form-control--PaddingRight) var(--pf-c-form-control--PaddingBottom) var(--pf-c-form-control--PaddingLeft);
+}
+
+textarea.pf-c-form-control {
+	height: auto;
+}
+
+.pf-c-form-control:hover, .pf-c-form-control:focus {
+    border-bottom-color: #0066CC;
+    border-bottom-color: var(--pf-global--primary-color--100);
+    border-bottom-width: 2px;
+    border-bottom-width: var(--pf-global--BorderWidth--md);
+}
+
+.pf-c-form-control[aria-invalid="true"] {
+    border-bottom-color: #C9190B;
+    border-bottom-color: var(--pf-global--danger-color--100);
+    border-bottom-width: 2px;
+    border-bottom-width: var(--pf-global--BorderWidth--md);
+}
+
+.pf-c-check__label, .pf-c-radio__label {
+	font-size: 14px;
+	font-size: var(--pf-global--FontSize--sm);
+}
+
+.pf-c-alert.pf-m-inline {
+    margin-bottom: 0.5rem; /* default - IE compatibility */
+    margin-bottom: var(--pf-global--spacer--sm);
+    padding: 0.25rem;
+    padding: var(--pf-global--spacer--xs);
+    border: solid #ededed;
+    border: solid var(--pf-global--BorderColor--300);
+    border-width: 1px;
+    border-width: var(--pf-c-alert--m-inline--BorderTopWidth) var(--pf-c-alert--m-inline--BorderRightWidth) var(--pf-c-alert--m-inline--BorderBottomWidth) var(--pf-c-alert--m-inline--BorderLeftWidth);
+    display: -ms-flexbox;
+    display: grid;
+    -ms-grid-columns: max-content 1fr max-content;
+    grid-template-columns:max-content 1fr max-content;
+    grid-template-columns: var(--pf-c-alert--grid-template-columns);
+    grid-template-rows: 1fr auto;
+    grid-template-rows: var(--pf-c-alert--grid-template-rows);
+}
+
+.pf-c-alert.pf-m-inline::before {
+    position: absolute;
+    top: -1px;
+    top: var(--pf-c-alert--m-inline--before--Top);
+    bottom: -1px;
+    bottom: var(--pf-c-alert--m-inline--before--Bottom);
+    left: 0;
+    width: 3px;
+    width: var(--pf-c-alert--m-inline--before--Width);
+    content: "";
+    background-color: #FFFFFF;
+    background-color: var(--pf-global--BackgroundColor--100);
+}
+
+.pf-c-alert.pf-m-inline.pf-m-success::before {
+    background-color: #92D400;
+    background-color: var(--pf-global--success-color--100);
+}
+
+.pf-c-alert.pf-m-inline.pf-m-danger::before {
+    background-color: #C9190B;
+    background-color: var(--pf-global--danger-color--100);
+}
+
+.pf-c-alert.pf-m-inline.pf-m-warning::before {
+    background-color: #F0AB00;
+    background-color: var(--pf-global--warning-color--100);
+}
+
+.pf-c-alert.pf-m-inline .pf-c-alert__icon {
+    padding: 1rem 0.5rem 1rem 1rem;
+    padding: var(--pf-c-alert--m-inline__icon--PaddingTop) var(--pf-c-alert--m-inline__icon--PaddingRight) var(--pf-c-alert--m-inline__icon--PaddingBottom) var(--pf-c-alert--m-inline__icon--PaddingLeft);
+    font-size: 16px;
+    font-size: var(--pf-c-alert--m-inline__icon--FontSize);
+}
+
+.pf-c-alert.pf-m-success .pf-c-alert__icon {
+    color: #92D400;
+    color: var(--pf-global--success-color--100);
+}
+
+.pf-c-alert.pf-m-success .pf-c-alert__title {
+    color: #486B00;
+    color: var(--pf-global--success-color--200);
+}
+
+.pf-c-alert.pf-m-danger .pf-c-alert__icon {
+    color: #C9190B;
+    color: var(--pf-global--danger-color--100);
+}
+
+.pf-c-alert.pf-m-danger .pf-c-alert__title {
+    color: #A30000;
+    color: var(--pf-global--danger-color--200);
+}
+
+.pf-c-alert.pf-m-warning .pf-c-alert__icon {
+    color: #F0AB00;
+    color: var(--pf-global--warning-color--100);
+}
+
+.pf-c-alert.pf-m-warning .pf-c-alert__title {
+    color: #795600;
+    color: var(--pf-global--warning-color--200);
+}
+
+.pf-c-alert__title {
+    font-size: 14px; /* default - IE compatibility */
+    font-size: var(--pf-global--FontSize--sm);
+    padding: 5px 8px;
+    padding: var(--pf-c-alert__title--PaddingTop) var(--pf-c-alert__title--PaddingRight) var(--pf-c-alert__title--PaddingBottom) var(--pf-c-alert__title--PaddingLeft);
+}
+
+.pf-c-button{
+    padding:0.375rem 1rem;
+    padding: var(--pf-global--spacer--form-element) var(--pf-global--spacer--md);
+}
+
+/* default - IE compatibility */
+.pf-m-primary {
+    color: #FFFFFF;
+    background-color: #0066CC;
+    background-color: var(--pf-global--primary-color--100);
+}
+
+/* default - IE compatibility */
+.pf-m-primary:hover {
+    background-color: #004080;
+    background-color: var(--pf-global--primary-color--200);
+}
+
+/* default - IE compatibility */
+.pf-c-button.pf-m-control {
+    border: solid 1px;
+    border: solid var(--pf-global--BorderWidth--sm);
+    border-color: rgba(230, 230, 230, 0.5);
+}
+/*End of IE compatibility*/
+h1#kc-page-title {
+    margin-top: 10px;
+}
+
+#kc-locale ul {
+    background-color: #FFF;
+    background-color: var(--pf-global--BackgroundColor--100);
+    display: none;
+    top: 20px;
+    min-width: 100px;
+    padding: 0;
+}
+
+#kc-locale-dropdown{
+    display: inline-block;
+}
+
+#kc-locale-dropdown:hover ul {
+    display:block;
+}
+
+/* IE compatibility */
+#kc-locale-dropdown a {
+    color: #6A6E73;
+    color: var(--pf-global--Color--200);
+    text-align: right;
+    font-size: 14px;
+    font-size: var(--pf-global--FontSize--sm);
+}
+
+/* IE compatibility */
+a#kc-current-locale-link::after {
+    content: "\2c5";
+    margin-left: 4px;
+    margin-left: var(--pf-global--spacer--xs)
+}
+
+.login-pf .container {
+    padding-top: 40px;
+}
+
+.login-pf a:hover {
+    color: #0099d3;
+}
+
+#kc-logo {
+    width: 100%;
+}
+
+div.kc-logo-text {
+    background-image: url(../img/keycloak-logo-text.png);
+    background-repeat: no-repeat;
+    height: 63px;
+    width: 300px;
+    margin: 0 auto;
+}
+
+div.kc-logo-text span {
+    display: none;
+}
+
+#kc-header {
+    color: #ededed;
+    overflow: visible;
+    white-space: nowrap;
+}
+
+#kc-header-wrapper {
+    font-size: 29px;
+    text-transform: uppercase;
+    letter-spacing: 3px;
+    line-height: 1.2em;
+    padding: 62px 10px 20px;
+    white-space: normal;
+}
+
+#kc-content {
+    width: 100%;
+}
+
+#kc-attempted-username {
+    font-size: 20px;
+    font-family: inherit;
+    font-weight: normal;
+    padding-right: 10px;
+}
+
+#kc-username {
+    text-align: center;
+    margin-bottom:-10px;
+}
+
+#kc-webauthn-settings-form {
+    padding-top: 8px;
+}
+
+#kc-form-webauthn .select-auth-box-parent {
+    pointer-events: none;
+}
+
+#kc-form-webauthn .select-auth-box-desc {
+    color: var(--pf-global--palette--black-600);
+}
+
+#kc-form-webauthn .select-auth-box-headline {
+    color: var(--pf-global--Color--300);
+}
+
+#kc-form-webauthn .select-auth-box-icon {
+    flex: 0 0 3em;
+}
+
+#kc-form-webauthn .select-auth-box-icon-properties {
+    margin-top: 10px;
+    font-size: 1.8em;
+}
+
+#kc-form-webauthn .select-auth-box-icon-properties.unknown-transport-class {
+    margin-top: 3px;
+}
+
+#kc-form-webauthn .pf-l-stack__item {
+    margin: -1px 0;
+}
+
+#kc-content-wrapper {
+    margin-top: 20px;
+}
+
+#kc-form-wrapper {
+    margin-top: 10px;
+}
+
+#kc-info {
+    margin: 20px -40px -30px;
+}
+
+#kc-info-wrapper {
+    font-size: 13px;
+    padding: 15px 35px;
+    background-color: #F0F0F0;
+}
+
+#kc-form-options span {
+    display: block;
+}
+
+#kc-form-options .checkbox {
+    margin-top: 0;
+    color: #72767b;
+}
+
+#kc-terms-text {
+    margin-bottom: 20px;
+}
+
+#kc-registration {
+    margin-bottom: 0;
+}
+
+/* TOTP */
+
+.subtitle {
+    text-align: right;
+    margin-top: 30px;
+    color: #909090;
+}
+
+.required {
+    color: #A30000; /* default - IE compatibility */
+    color: var(--pf-global--danger-color--200);
+}
+
+ol#kc-totp-settings {
+    margin: 0;
+    padding-left: 20px;
+}
+
+ul#kc-totp-supported-apps {
+    margin-bottom: 10px;
+}
+
+#kc-totp-secret-qr-code {
+    max-width:150px;
+    max-height:150px;
+}
+
+#kc-totp-secret-key {
+    background-color: #fff;
+    color: #333333;
+    font-size: 16px;
+    padding: 10px 0;
+}
+
+/* OAuth */
+
+#kc-oauth h3 {
+    margin-top: 0;
+}
+
+#kc-oauth ul {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+#kc-oauth ul li {
+    border-top: 1px solid rgba(255, 255, 255, 0.1);
+    font-size: 12px;
+    padding: 10px 0;
+}
+
+#kc-oauth ul li:first-of-type {
+    border-top: 0;
+}
+
+#kc-oauth .kc-role {
+    display: inline-block;
+    width: 50%;
+}
+
+/* Code */
+#kc-code textarea {
+    width: 100%;
+    height: 8em;
+}
+
+/* Social */
+.kc-social-links {
+    margin-top: 20px;
+}
+
+.kc-social-provider-logo {
+    font-size: 23px;
+    width: 30px;
+    height: 25px;
+    float: left;
+}
+
+.kc-social-gray {
+    color: #737679; /* default - IE compatibility */
+    color: var(--pf-global--Color--200);
+}
+
+.kc-social-item {
+    margin-bottom: 0.5rem; /* default - IE compatibility */
+    margin-bottom: var(--pf-global--spacer--sm);
+    font-size: 15px;
+    text-align: center;
+}
+
+.kc-social-provider-name {
+    position: relative;
+    top: 3px;
+}
+
+.kc-social-icon-text {
+    left: -15px;
+}
+
+.kc-social-grid {
+    display:grid;
+    grid-column-gap: 10px;
+    grid-row-gap: 5px;
+    grid-column-end: span 6;
+    --pf-l-grid__item--GridColumnEnd: span 6;
+}
+
+.kc-social-grid .kc-social-icon-text {
+    left: -10px;
+}
+
+.kc-login-tooltip {
+    position: relative;
+    display: inline-block;
+}
+
+.kc-social-section {
+    text-align: center;
+}
+
+.kc-social-section hr{
+    margin-bottom: 10px
+}
+
+.kc-login-tooltip .kc-tooltip-text{
+    top:-3px;
+    left:160%;
+    background-color: black;
+    visibility: hidden;
+    color: #fff;
+
+    min-width:130px;
+    text-align: center;
+    border-radius: 2px;
+    box-shadow:0 1px 8px rgba(0,0,0,0.6);
+    padding: 5px;
+
+    position: absolute;
+    opacity:0;
+    transition:opacity 0.5s;
+}
+
+/* Show tooltip */
+.kc-login-tooltip:hover .kc-tooltip-text {
+    visibility: visible;
+    opacity:0.7;
+}
+
+/* Arrow for tooltip */
+.kc-login-tooltip .kc-tooltip-text::after {
+    content: " ";
+    position: absolute;
+    top: 15px;
+    right: 100%;
+    margin-top: -5px;
+    border-width: 5px;
+    border-style: solid;
+    border-color: transparent black transparent transparent;
+}
+
+@media (min-width: 768px) {
+    #kc-container-wrapper {
+        position: absolute;
+        width: 100%;
+    }
+
+    .login-pf .container {
+        padding-right: 80px;
+    }
+
+    #kc-locale {
+        position: relative;
+        text-align: right;
+        z-index: 9999;
+    }
+}
+
+@media (max-width: 767px) {
+
+    .login-pf body {
+        background: white;
+    }
+
+    #kc-header {
+        padding-left: 15px;
+        padding-right: 15px;
+        float: none;
+        text-align: left;
+    }
+
+    #kc-header-wrapper {
+        font-size: 16px;
+        font-weight: bold;
+        padding: 20px 60px 0 0;
+        color: #72767b;
+        letter-spacing: 0;
+    }
+
+    div.kc-logo-text {
+        margin: 0;
+        width: 150px;
+        height: 32px;
+        background-size: 100%;
+    }
+
+    #kc-form {
+        float: none;
+    }
+
+    #kc-info-wrapper {
+        border-top: 1px solid rgba(255, 255, 255, 0.1);
+        background-color: transparent;
+    }
+
+    .login-pf .container {
+        padding-top: 15px;
+        padding-bottom: 15px;
+    }
+
+    #kc-locale {
+        position: absolute;
+        width: 200px;
+        top: 20px;
+        right: 20px;
+        text-align: right;
+        z-index: 9999;
+    }
+}
+
+@media (min-height: 646px) {
+    #kc-container-wrapper {
+        bottom: 12%;
+    }
+}
+
+@media (max-height: 645px) {
+    #kc-container-wrapper {
+        padding-top: 50px;
+        top: 20%;
+    }
+}
+
+.card-pf form.form-actions .btn {
+    float: right;
+    margin-left: 10px;
+}
+
+#kc-form-buttons {
+    margin-top: 20px;
+}
+
+.login-pf-page .login-pf-brand {
+    margin-top: 20px;
+    max-width: 360px;
+    width: 40%;
+}
+
+/* Internet Explorer 11 compatibility workaround for select-authenticator screen */
+@media all and (-ms-high-contrast: none),
+(-ms-high-contrast: active) {
+    .select-auth-box-parent {
+        border-top: 1px solid #f0f0f0;
+        padding-top: 1rem;
+        padding-bottom: 1rem;
+        cursor: pointer;
+    }
+
+    .select-auth-box-headline {
+        font-size: 16px;
+        color: #06c;
+        font-weight: bold;
+    }
+
+    .select-auth-box-desc {
+        font-size: 14px;
+    }
+
+    .pf-l-stack {
+        flex-basis: 100%;
+    }
+}
+/* End of IE11 workaround for select-authenticator screen */
+
+.select-auth-box-arrow{
+    display: flex;
+    align-items: center;
+    margin-right: 2rem;
+}
+
+.select-auth-box-icon{
+    display: flex;
+    flex: 0 0 2em;
+    justify-content: center;
+    margin-right: 1rem;
+    margin-left: 3rem;
+}
+
+.select-auth-box-parent{
+    border-top: 1px solid var(--pf-global--palette--black-200);
+    padding-top: 1rem;
+    padding-bottom: 1rem;
+    cursor: pointer;
+}
+
+.select-auth-box-parent:hover{
+    background-color: #f7f8f8;
+}
+
+.select-auth-container {
+    padding-bottom: 0px !important;
+}
+
+.select-auth-box-headline {
+    font-size: var(--pf-global--FontSize--md);
+    color: var(--pf-global--primary-color--100);
+    font-weight: bold;
+}
+
+.select-auth-box-desc {
+    font-size: var(--pf-global--FontSize--sm);
+}
+
+.select-auth-box-paragraph {
+    text-align: center;
+    font-size: var(--pf-global--FontSize--md);
+    margin-bottom: 5px;
+}
+
+.card-pf {
+    margin: 0 auto;
+    box-shadow: var(--pf-global--BoxShadow--lg);
+    padding: 0 20px;
+    max-width: 500px;
+    border-top: 4px solid;
+    border-color: #0066CC; /* default - IE compatibility */
+    border-color: var(--pf-global--primary-color--100);
+}
+
+/*phone*/
+@media (max-width: 767px) {
+    .login-pf-page .card-pf {
+        max-width: none;
+        margin-left: 0;
+        margin-right: 0;
+        padding-top: 0;
+        border-top: 0;
+        box-shadow: 0 0;
+    }
+
+    .kc-social-grid {
+        grid-column-end: 12;
+        --pf-l-grid__item--GridColumnEnd: span 12;
+    }
+
+    .kc-social-grid .kc-social-icon-text {
+        left: -15px;
+    }
+}
+
+.login-pf-page .login-pf-signup {
+    font-size: 15px;
+    color: #72767b;
+}
+#kc-content-wrapper .row {
+    margin-left: 0;
+    margin-right: 0;
+}
+
+.login-pf-page.login-pf-page-accounts {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+.login-pf-page .btn-primary {
+    margin-top: 0;
+}
+
+.login-pf-page .list-view-pf .list-group-item {
+    border-bottom: 1px solid #ededed;
+}
+
+.login-pf-page .list-view-pf-description {
+    width: 100%;
+}
+
+#kc-form-login div.form-group:last-of-type,
+#kc-register-form div.form-group:last-of-type,
+#kc-update-profile-form div.form-group:last-of-type {
+    margin-bottom: 0px;
+}
+
+.no-bottom-margin {
+    margin-bottom: 0;
+}
+
+#kc-back {
+    margin-top: 5px;
+}
+
+/* Recovery codes */
+.kc-recovery-codes-warning {
+    margin-bottom: 32px;
+}
+.kc-recovery-codes-warning .pf-c-alert__description p {
+    font-size: 0.875rem;
+}
+.kc-recovery-codes-list {
+    list-style: none;
+    columns: 2;
+    margin: 16px 0;
+    padding: 16px 16px 8px 16px;
+    border: 1px solid #D2D2D2;
+}
+.kc-recovery-codes-list li {
+    margin-bottom: 8px;
+    font-size: 11px;
+}
+.kc-recovery-codes-list li span {
+    color: #6A6E73;
+    width: 16px;
+    text-align: right;
+    display: inline-block;
+    margin-right: 1px;
+}
+
+.kc-recovery-codes-actions {
+    margin-bottom: 24px;
+}
+.kc-recovery-codes-actions button {
+    padding-left: 0;
+}
+.kc-recovery-codes-actions button i {
+    margin-right: 8px;
+}
+
+.kc-recovery-codes-confirmation {
+    align-items: baseline;
+    margin-bottom: 16px;
+}
+/* End Recovery codes */
diff --git a/keycloak-theme/themes/gitsearch/login/resources/css/tile.css b/keycloak-theme/themes/gitsearch/login/resources/css/tile.css
new file mode 100644
index 0000000000000000000000000000000000000000..62c2a932a041915fab53e30c493d6168781f57fb
--- /dev/null
+++ b/keycloak-theme/themes/gitsearch/login/resources/css/tile.css
@@ -0,0 +1,207 @@
+/*Internet Explorer 11 compatibility workaround - IE does not support CSS variables */
+
+@media all and (-ms-high-contrast: none),
+(-ms-high-contrast: active) {
+    .pf-c-tile {
+        position: relative;
+        display: -ms-inline-grid;
+        display: inline-grid;
+        padding: 1.5rem 1.5rem 1.5rem 1.5rem;
+        margin-bottom: 0.25rem;
+        text-align: center;
+        cursor: pointer;
+        background-color: #fff;
+        grid-template-rows: -webkit-min-content;
+        -ms-grid-rows: -webkit-min-content;
+        -ms-grid-rows: min-content;
+        grid-template-rows: min-content;
+    }
+    .pf-c-tile::before {
+        position: absolute;
+        top: 0;
+        right: 0;
+        bottom: 0;
+        left: 0;
+        pointer-events: none;
+        content: "";
+        border: 1px solid #d2d2d2;
+        border-radius: 3px;
+    }
+    .pf-c-tile:hover {
+        border: 1px solid #06c;
+        border-radius: 3px;
+    }
+    .pf-c-tile:hover .pf-c-tile__title,
+    .pf-c-tile:hover .pf-c-tile__icon {
+        color: #06c;
+    }
+    .pf-c-tile__input:checked + .pf-c-tile .pf-c-tile__title,
+    .pf-c-tile__input:checked + .pf-c-tile .pf-c-tile__icon {
+        color: #06c;
+    }
+    .pf-c-tile__input:checked + .pf-c-tile {
+        border: 2px solid #06c;
+        border-radius: 3px;
+    }
+    .pf-c-tile.pf-m-disabled {
+        pointer-events: none;
+    }
+    .pf-c-tile__header {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+    }
+    .pf-c-tile__header.pf-m-stacked {
+        flex-direction: column;
+        justify-content: initial;
+    }
+    .pf-c-tile__header.pf-m-stacked .pf-c-tile__icon {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        margin-bottom: 0.25rem;
+    }
+    .pf-c-tile__title {
+        color: #6a6e73;
+    }
+    .pf-c-tile__body {
+        font-size: 0.75rem;
+        color: #6a6e73;
+    }
+    .pf-c-tile__icon {
+        margin-right: 0.5rem;
+        font-size: 1.5rem;
+        color: #6a6e73;
+    }
+}
+
+
+/*End of the IE11 workaround*/
+
+.pf-c-tile {
+    --pf-c-tile--PaddingTop: var(--pf-global--spacer--lg);
+    --pf-c-tile--PaddingRight: var(--pf-global--spacer--lg);
+    --pf-c-tile--PaddingBottom: var(--pf-global--spacer--lg);
+    --pf-c-tile--PaddingLeft: var(--pf-global--spacer--lg);
+    --pf-c-tile--BackgroundColor: var(--pf-global--BackgroundColor--100);
+    --pf-c-tile--before--BorderColor: var(--pf-global--BorderColor--100);
+    --pf-c-tile--before--BorderWidth: var(--pf-global--BorderWidth--sm);
+    --pf-c-tile--before--BorderRadius: var(--pf-global--BorderRadius--sm);
+    --pf-c-tile--hover--before--BorderColor: var(--pf-global--primary-color--100);
+    --pf-c-tile--m-selected--before--BorderWidth: var(--pf-global--BorderWidth--md);
+    --pf-c-tile--m-selected--before--BorderColor: var(--pf-global--primary-color--100);
+    --pf-c-tile--focus--before--BorderWidth: var(--pf-global--BorderWidth--md);
+    --pf-c-tile--focus--before--BorderColor: var(--pf-global--primary-color--100);
+    --pf-c-tile--m-disabled--BackgroundColor: var(--pf-global--disabled-color--300);
+    --pf-c-tile__title--Color: var(--pf-global--Color--100);
+    --pf-c-tile--hover__title--Color: var(--pf-global--primary-color--100);
+    --pf-c-tile--m-selected__title--Color: var(--pf-global--primary-color--100);
+    --pf-c-tile--focus__title--Color: var(--pf-global--primary-color--100);
+    --pf-c-tile--m-disabled__title--Color: var(--pf-global--disabled-color--100);
+    --pf-c-tile__icon--MarginRight: var(--pf-global--spacer--sm);
+    --pf-c-tile__icon--FontSize: var(--pf-global--icon--FontSize--md);
+    --pf-c-tile__icon--Color: var(--pf-global--Color--100);
+    --pf-c-tile--hover__icon--Color: var(--pf-global--primary-color--100);
+    --pf-c-tile--m-selected__icon--Color: var(--pf-global--primary-color--100);
+    --pf-c-tile--m-disabled__icon--Color: var(--pf-global--disabled-color--100);
+    --pf-c-tile--focus__icon--Color: var(--pf-global--primary-color--100);
+    --pf-c-tile__header--m-stacked__icon--MarginBottom: var(--pf-global--spacer--xs);
+    --pf-c-tile__header--m-stacked__icon--FontSize: var(--pf-global--icon--FontSize--lg);
+    --pf-c-tile--m-display-lg__header--m-stacked__icon--FontSize: var(--pf-global--icon--FontSize--xl);
+    --pf-c-tile__body--Color: var(--pf-global--Color--100);
+    --pf-c-tile__body--FontSize: var(--pf-global--FontSize--xs);
+    --pf-c-tile--m-disabled__body--Color: var(--pf-global--disabled-color--100);
+    position: relative;
+    display: inline-grid;
+    padding: var(--pf-c-tile--PaddingTop) var(--pf-c-tile--PaddingRight) var(--pf-c-tile--PaddingBottom) var(--pf-c-tile--PaddingLeft);
+    margin-bottom: 0.25rem;
+    text-align: center;
+    cursor: pointer;
+    background-color: var(--pf-c-tile--BackgroundColor);
+    grid-template-rows: min-content;
+    overflow: hidden;
+}
+
+.pf-c-tile::before {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    pointer-events: none;
+    content: "";
+    border: var(--pf-c-tile--before--BorderWidth) solid var(--pf-c-tile--before--BorderColor);
+    border-radius: var(--pf-c-tile--before--BorderRadius);
+}
+
+.pf-c-tile:hover {
+    --pf-c-tile__title--Color: var(--pf-c-tile--hover__title--Color);
+    --pf-c-tile__icon--Color: var(--pf-c-tile--hover__icon--Color);
+    --pf-c-tile--before--BorderColor: var(--pf-c-tile--hover--before--BorderColor);
+}
+
+.pf-c-tile__input:checked + .pf-c-tile {
+    --pf-c-tile__title--Color: var(--pf-c-tile--m-selected__title--Color);
+    --pf-c-tile__icon--Color: var(--pf-c-tile--m-selected__icon--Color);
+    --pf-c-tile--before--BorderWidth: var(--pf-c-tile--m-selected--before--BorderWidth);
+    --pf-c-tile--before--BorderColor: var(--pf-c-tile--m-selected--before--BorderColor);
+}
+
+.pf-c-tile:focus {
+    --pf-c-tile__title--Color: var(--pf-c-tile--focus__title--Color);
+    --pf-c-tile__icon--Color: var(--pf-c-tile--focus__icon--Color);
+    --pf-c-tile--before--BorderWidth: var(--pf-c-tile--focus--before--BorderWidth);
+    --pf-c-tile--before--BorderColor: var(--pf-c-tile--focus--before--BorderColor);
+}
+
+.pf-c-tile.pf-m-disabled {
+    --pf-c-tile--BackgroundColor: var(--pf-c-tile--m-disabled--BackgroundColor);
+    --pf-c-tile__title--Color: var(--pf-c-tile--m-disabled__title--Color);
+    --pf-c-tile__body--Color: var(--pf-c-tile--m-disabled__body--Color);
+    --pf-c-tile--before--BorderWidth: 0;
+    --pf-c-tile__icon--Color: var(--pf-c-tile--m-disabled__icon--Color);
+    pointer-events: none;
+}
+
+.pf-c-tile.pf-m-display-lg .pf-c-tile__header.pf-m-stacked {
+    --pf-c-tile__icon--FontSize: var(--pf-c-tile--m-display-lg__header--m-stacked__icon--FontSize);
+}
+
+.pf-c-tile__input {
+    display: none;
+}
+
+.pf-c-tile__header {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.pf-c-tile__header.pf-m-stacked {
+    --pf-c-tile__icon--MarginRight: 0;
+    --pf-c-tile__icon--FontSize: var(--pf-c-tile__header--m-stacked__icon--FontSize);
+    flex-direction: column;
+    justify-content: initial;
+}
+
+.pf-c-tile__header.pf-m-stacked .pf-c-tile__icon {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-bottom: var(--pf-c-tile__header--m-stacked__icon--MarginBottom);
+}
+
+.pf-c-tile__title {
+    color: var(--pf-c-tile__title--Color);
+}
+
+.pf-c-tile__body {
+    font-size: var(--pf-c-tile__body--FontSize);
+    color: var(--pf-c-tile__body--Color);
+}
+
+.pf-c-tile__icon {
+    margin-right: var(--pf-c-tile__icon--MarginRight);
+    font-size: var(--pf-c-tile__icon--FontSize);
+    color: var(--pf-c-tile__icon--Color);
+}
\ No newline at end of file
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/feedback-error-arrow-down.png b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-error-arrow-down.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f2d9d2aeb1c1461767988a042aae50492d454bc
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-error-arrow-down.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/feedback-error-sign.png b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-error-sign.png
new file mode 100644
index 0000000000000000000000000000000000000000..0dd500445d7249ddd1b1dea7dc79d5e2f75cf223
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-error-sign.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/feedback-success-arrow-down.png b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-success-arrow-down.png
new file mode 100644
index 0000000000000000000000000000000000000000..03cc0c45dcc73e42f6b3718c8fe4a42aab71d424
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-success-arrow-down.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/feedback-success-sign.png b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-success-sign.png
new file mode 100644
index 0000000000000000000000000000000000000000..640bd71cab7bdfc7a8adcf28ffaf6db736a1c008
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-success-sign.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/feedback-warning-arrow-down.png b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-warning-arrow-down.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f2d9d2aeb1c1461767988a042aae50492d454bc
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-warning-arrow-down.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/feedback-warning-sign.png b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-warning-sign.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9392a356fd3b383997c1ef289b48d02be96c351
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/feedback-warning-sign.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-bg.png b/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..4004db4420fa21d3638b2b39b4697559846be380
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-bg.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-logo-text.png b/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-logo-text.png
new file mode 100644
index 0000000000000000000000000000000000000000..63f3b9f87deb2dee6172d44fbad7177064245101
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-logo-text.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-logo.png b/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffa5b0bf9e0e7122dfc61198ba750d5da2357ab0
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/keycloak-logo.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/resources/img/logo-top.png b/keycloak-theme/themes/gitsearch/login/resources/img/logo-top.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc3e849dccdb70f0c0c940b6c364b7761ebe55d4
Binary files /dev/null and b/keycloak-theme/themes/gitsearch/login/resources/img/logo-top.png differ
diff --git a/keycloak-theme/themes/gitsearch/login/template.ftl b/keycloak-theme/themes/gitsearch/login/template.ftl
new file mode 100644
index 0000000000000000000000000000000000000000..536f06d50a23be154d364b09fcc28c74921b481b
--- /dev/null
+++ b/keycloak-theme/themes/gitsearch/login/template.ftl
@@ -0,0 +1,156 @@
+<#macro registrationLayout bodyClass="" displayInfo=false displayMessage=true displayRequiredFields=false>
+<!DOCTYPE html>
+<html class="${properties.kcHtmlClass!}">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <meta name="robots" content="noindex, nofollow">
+
+    <#if properties.meta?has_content>
+        <#list properties.meta?split(' ') as meta>
+            <meta name="${meta?split('==')[0]}" content="${meta?split('==')[1]}"/>
+        </#list>
+    </#if>
+    <title>${msg("loginTitle",(realm.displayName!''))}</title>
+    <link rel="icon" href="${url.resourcesPath}/img/favicon.ico" />
+    <#if properties.stylesCommon?has_content>
+        <#list properties.stylesCommon?split(' ') as style>
+            <link href="${url.resourcesCommonPath}/${style}" rel="stylesheet" />
+        </#list>
+    </#if>
+    <#if properties.styles?has_content>
+        <#list properties.styles?split(' ') as style>
+            <link href="${url.resourcesPath}/${style}" rel="stylesheet" />
+        </#list>
+    </#if>
+    <#if properties.scripts?has_content>
+        <#list properties.scripts?split(' ') as script>
+            <script src="${url.resourcesPath}/${script}" type="text/javascript"></script>
+        </#list>
+    </#if>
+    <#if scripts??>
+        <#list scripts as script>
+            <script src="${script}" type="text/javascript"></script>
+        </#list>
+    </#if>
+</head>
+
+<body class="${properties.kcBodyClass!}">
+<div class="${properties.kcLoginClass!}">
+    <div id="kc-header" class="${properties.kcHeaderClass!}">
+        <div id="kc-header-wrapper"> <img _ngcontent-juv-c133="" src="${url.resourcesPath}/img/logo-top.png" title="codeAbility Home" alt="codeAbility" width="150px">  </div>
+    </div>
+    <div class="${properties.kcFormCardClass!}">
+        <header class="${properties.kcFormHeaderClass!}">
+            <#if realm.internationalizationEnabled  && locale.supported?size gt 1>
+                <div class="${properties.kcLocaleMainClass!}" id="kc-locale">
+                    <div id="kc-locale-wrapper" class="${properties.kcLocaleWrapperClass!}">
+                        <div id="kc-locale-dropdown" class="${properties.kcLocaleDropDownClass!}">
+                            <a href="#" id="kc-current-locale-link">${locale.current}</a>
+                            <ul class="${properties.kcLocaleListClass!}">
+                                <#list locale.supported as l>
+                                    <li class="${properties.kcLocaleListItemClass!}">
+                                        <a class="${properties.kcLocaleItemClass!}" href="${l.url}">${l.label}</a>
+                                    </li>
+                                </#list>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </#if>
+        <#if !(auth?has_content && auth.showUsername() && !auth.showResetCredentials())>
+            <#if displayRequiredFields>
+                <div class="${properties.kcContentWrapperClass!}">
+                    <div class="${properties.kcLabelWrapperClass!} subtitle">
+                        <span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span>
+                    </div>
+                    <div class="col-md-10">
+                        <h1 id="kc-page-title"><#nested "header"></h1>
+                    </div>
+                </div>
+            <#else>
+                <h1 id="kc-page-title"><#nested "header"></h1>
+            </#if>
+        <#else>
+            <#if displayRequiredFields>
+                <div class="${properties.kcContentWrapperClass!}">
+                    <div class="${properties.kcLabelWrapperClass!} subtitle">
+                        <span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span>
+                    </div>
+                    <div class="col-md-10">
+                        <#nested "show-username">
+                        <div id="kc-username" class="${properties.kcFormGroupClass!}">
+                            <label id="kc-attempted-username">${auth.attemptedUsername}</label>
+                            <a id="reset-login" href="${url.loginRestartFlowUrl}">
+                                <div class="kc-login-tooltip">
+                                    <i class="${properties.kcResetFlowIcon!}"></i>
+                                    <span class="kc-tooltip-text">${msg("restartLoginTooltip")}</span>
+                                </div>
+                            </a>
+                        </div>
+                    </div>
+                </div>
+            <#else>
+                <#nested "show-username">
+                <div id="kc-username" class="${properties.kcFormGroupClass!}">
+                    <label id="kc-attempted-username">${auth.attemptedUsername}</label>
+                    <a id="reset-login" href="${url.loginRestartFlowUrl}">
+                        <div class="kc-login-tooltip">
+                            <i class="${properties.kcResetFlowIcon!}"></i>
+                            <span class="kc-tooltip-text">${msg("restartLoginTooltip")}</span>
+                        </div>
+                    </a>
+                </div>
+            </#if>
+        </#if>
+      </header>
+      <div id="kc-content">
+        <div id="kc-content-wrapper">
+
+          <#-- App-initiated actions should not see warning messages about the need to complete the action -->
+          <#-- during login.                                                                               -->
+          <#if displayMessage && message?has_content && (message.type != 'warning' || !isAppInitiatedAction??)>
+              <div class="alert-${message.type} ${properties.kcAlertClass!} pf-m-<#if message.type = 'error'>danger<#else>${message.type}</#if>">
+                  <div class="pf-c-alert__icon">
+                      <#if message.type = 'success'><span class="${properties.kcFeedbackSuccessIcon!}"></span></#if>
+                      <#if message.type = 'warning'><span class="${properties.kcFeedbackWarningIcon!}"></span></#if>
+                      <#if message.type = 'error'><span class="${properties.kcFeedbackErrorIcon!}"></span></#if>
+                      <#if message.type = 'info'><span class="${properties.kcFeedbackInfoIcon!}"></span></#if>
+                  </div>
+                      <span class="${properties.kcAlertTitleClass!}">${kcSanitize(message.summary)?no_esc}</span>
+              </div>
+          </#if>
+
+        <#nested "socialProviders">
+
+
+          <#nested "form">
+
+          <#if auth?has_content && auth.showTryAnotherWayLink()>
+              <form id="kc-select-try-another-way-form" action="${url.loginAction}" method="post">
+                  <div class="${properties.kcFormGroupClass!}">
+                      <input type="hidden" name="tryAnotherWay" value="on"/>
+                      <a href="#" id="try-another-way"
+                         onclick="document.forms['kc-select-try-another-way-form'].submit();return false;">${msg("doTryAnotherWay")}</a>
+                  </div>
+              </form>
+          </#if>
+
+
+
+          <#if displayInfo>
+              <div id="kc-info" class="${properties.kcSignUpClass!}">
+                  <div id="kc-info-wrapper" class="${properties.kcInfoAreaWrapperClass!}">
+                      <#nested "info">
+                  </div>
+              </div>
+          </#if>
+        </div>
+      </div>
+
+    </div>
+  </div>
+</body>
+</html>
+</#macro>
diff --git a/keycloak-theme/themes/gitsearch/login/theme.properties b/keycloak-theme/themes/gitsearch/login/theme.properties
new file mode 100644
index 0000000000000000000000000000000000000000..45bdc07650415c63b73ad822b347a833321ea63b
--- /dev/null
+++ b/keycloak-theme/themes/gitsearch/login/theme.properties
@@ -0,0 +1,163 @@
+parent=base
+import=common/keycloak
+
+styles=css/login.css css/tile.css
+stylesCommon=web_modules/@patternfly/react-core/dist/styles/base.css web_modules/@patternfly/react-core/dist/styles/app.css node_modules/patternfly/dist/css/patternfly.min.css node_modules/patternfly/dist/css/patternfly-additions.min.css lib/pficon/pficon.css
+
+meta=viewport==width=device-width,initial-scale=1
+
+kcHtmlClass=login-pf
+kcLoginClass=login-pf-page
+
+kcLogoLink=http://www.keycloak.org
+
+kcLogoClass=login-pf-brand
+
+kcContainerClass=container-fluid
+kcContentClass=col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3 col-lg-6 col-lg-offset-3
+
+kcHeaderClass=login-pf-page-header
+kcFeedbackAreaClass=col-md-12
+kcLocaleClass=col-xs-12 col-sm-1
+
+## Locale
+kcLocaleMainClass=pf-c-dropdown
+kcLocaleListClass=pf-c-dropdown__menu pf-m-align-right
+kcLocaleItemClass=pf-c-dropdown__menu-item
+
+## Alert
+kcAlertClass=pf-c-alert pf-m-inline
+kcAlertTitleClass=pf-c-alert__title kc-feedback-text
+
+kcFormAreaClass=col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-2
+kcFormCardClass=card-pf
+
+### Social providers
+kcFormSocialAccountListClass=pf-c-login__main-footer-links kc-social-links
+kcFormSocialAccountListGridClass=pf-l-grid kc-social-grid
+kcFormSocialAccountListButtonClass=pf-c-button pf-m-control pf-m-block kc-social-item kc-social-gray
+kcFormSocialAccountGridItem=pf-l-grid__item
+
+kcFormSocialAccountNameClass=kc-social-provider-name
+kcFormSocialAccountLinkClass=pf-c-login__main-footer-links-item-link
+kcFormSocialAccountSectionClass=kc-social-section kc-social-gray
+kcFormHeaderClass=login-pf-header
+
+kcFeedbackErrorIcon=fa fa-fw fa-exclamation-circle
+kcFeedbackWarningIcon=fa fa-fw fa-exclamation-triangle
+kcFeedbackSuccessIcon=fa fa-fw fa-check-circle
+kcFeedbackInfoIcon=fa fa-fw fa-info-circle
+
+kcResetFlowIcon=pficon pficon-arrow fa
+
+# WebAuthn icons
+kcWebAuthnKeyIcon=pficon pficon-key
+kcWebAuthnDefaultIcon=pficon pficon-key
+kcWebAuthnUnknownIcon=pficon pficon-key unknown-transport-class
+kcWebAuthnUSB=fa fa-usb
+kcWebAuthnNFC=fa fa-wifi
+kcWebAuthnBLE=fa fa-bluetooth-b
+kcWebAuthnInternal=pficon pficon-key
+
+kcFormClass=form-horizontal
+kcFormGroupClass=form-group
+kcFormGroupErrorClass=has-error
+kcLabelClass=pf-c-form__label pf-c-form__label-text
+kcLabelWrapperClass=col-xs-12 col-sm-12 col-md-12 col-lg-12
+kcInputClass=pf-c-form-control
+kcInputHelperTextBeforeClass=pf-c-form__helper-text pf-c-form__helper-text-before
+kcInputHelperTextAfterClass=pf-c-form__helper-text pf-c-form__helper-text-after
+kcInputClassRadio=pf-c-radio
+kcInputClassRadioInput=pf-c-radio__input
+kcInputClassRadioLabel=pf-c-radio__label
+kcInputClassCheckbox=pf-c-check
+kcInputClassCheckboxInput=pf-c-check__input
+kcInputClassCheckboxLabel=pf-c-check__label
+kcInputClassRadioCheckboxLabelDisabled=pf-m-disabled
+kcInputErrorMessageClass=pf-c-form__helper-text pf-m-error required kc-feedback-text
+kcInputWrapperClass=col-xs-12 col-sm-12 col-md-12 col-lg-12
+kcFormOptionsClass=col-xs-12 col-sm-12 col-md-12 col-lg-12
+kcFormButtonsClass=col-xs-12 col-sm-12 col-md-12 col-lg-12
+kcFormSettingClass=login-pf-settings
+kcTextareaClass=form-control
+kcSignUpClass=login-pf-signup
+
+
+kcInfoAreaClass=col-xs-12 col-sm-4 col-md-4 col-lg-5 details
+
+### user-profile grouping
+kcFormGroupHeader=pf-c-form__group
+
+##### css classes for form buttons
+# main class used for all buttons
+kcButtonClass=pf-c-button
+# classes defining priority of the button - primary or default (there is typically only one priority button for the form)
+kcButtonPrimaryClass=pf-m-primary
+kcButtonDefaultClass=btn-default
+# classes defining size of the button
+kcButtonLargeClass=btn-lg
+kcButtonBlockClass=pf-m-block
+
+##### css classes for input
+kcInputLargeClass=input-lg
+
+##### css classes for form accessability
+kcSrOnlyClass=sr-only
+
+##### css classes for select-authenticator form
+kcSelectAuthListClass=pf-l-stack select-auth-container
+kcSelectAuthListItemClass=pf-l-stack__item select-auth-box-parent pf-l-split
+kcSelectAuthListItemIconClass=pf-l-split__item select-auth-box-icon
+kcSelectAuthListItemIconPropertyClass=fa-2x select-auth-box-icon-properties
+kcSelectAuthListItemBodyClass=pf-l-split__item pf-l-stack
+kcSelectAuthListItemHeadingClass=pf-l-stack__item select-auth-box-headline pf-c-title
+kcSelectAuthListItemDescriptionClass=pf-l-stack__item select-auth-box-desc
+kcSelectAuthListItemFillClass=pf-l-split__item pf-m-fill
+kcSelectAuthListItemArrowClass=pf-l-split__item select-auth-box-arrow
+kcSelectAuthListItemArrowIconClass=fa fa-angle-right fa-lg
+kcSelectAuthListItemTitle=select-auth-box-paragraph
+
+##### css classes for the authenticators
+kcAuthenticatorDefaultClass=fa fa-list list-view-pf-icon-lg
+kcAuthenticatorPasswordClass=fa fa-unlock list-view-pf-icon-lg
+kcAuthenticatorOTPClass=fa fa-mobile list-view-pf-icon-lg
+kcAuthenticatorWebAuthnClass=fa fa-key list-view-pf-icon-lg
+kcAuthenticatorWebAuthnPasswordlessClass=fa fa-key list-view-pf-icon-lg
+
+##### css classes for the OTP Login Form
+kcLoginOTPListClass=pf-c-tile
+kcLoginOTPListInputClass=pf-c-tile__input
+kcLoginOTPListItemHeaderClass=pf-c-tile__header
+kcLoginOTPListItemIconBodyClass=pf-c-tile__icon
+kcLoginOTPListItemIconClass=fa fa-mobile
+kcLoginOTPListItemTitleClass=pf-c-tile__title
+
+##### css classes for identity providers logos
+kcCommonLogoIdP=kc-social-provider-logo kc-social-gray
+
+## Social
+kcLogoIdP-facebook=fa fa-facebook
+kcLogoIdP-google=fa fa-google
+kcLogoIdP-github=fa fa-github
+kcLogoIdP-linkedin=fa fa-linkedin
+kcLogoIdP-instagram=fa fa-instagram
+## windows instead of microsoft - not included in PF4
+kcLogoIdP-microsoft=fa fa-windows
+kcLogoIdP-bitbucket=fa fa-bitbucket
+kcLogoIdP-gitlab=fa fa-gitlab
+kcLogoIdP-paypal=fa fa-paypal
+kcLogoIdP-stackoverflow=fa fa-stack-overflow
+kcLogoIdP-twitter=fa fa-twitter
+kcLogoIdP-openshift-v4=pf-icon pf-icon-openshift
+kcLogoIdP-openshift-v3=pf-icon pf-icon-openshift
+kcLogoIdP-uibk = fa fa-university
+kcLogoIdP-oidc = fa fa-gitlab
+
+## Recovery codes
+kcRecoveryCodesWarning=kc-recovery-codes-warning
+kcRecoveryCodesList=kc-recovery-codes-list
+kcRecoveryCodesActions=kc-recovery-codes-actions
+kcRecoveryCodesConfirmation=kc-recovery-codes-confirmation
+kcCheckClass=pf-c-check
+kcCheckInputClass=pf-c-check__input
+kcCheckLabelClass=pf-c-check__label