diff --git a/authentik/core/templates/base/skeleton.html b/authentik/core/templates/base/skeleton.html
index c5b0adc984..e22bd25655 100644
--- a/authentik/core/templates/base/skeleton.html
+++ b/authentik/core/templates/base/skeleton.html
@@ -11,7 +11,7 @@
         
{% block title %}{% trans title|default:config.authentik.branding.title %}{% endblock %}
         
         
-        
+        
         
         
         {% block head %}
diff --git a/authentik/flows/templates/flows/shell.html b/authentik/flows/templates/flows/shell.html
index 0619493f55..6f7b527201 100644
--- a/authentik/flows/templates/flows/shell.html
+++ b/authentik/flows/templates/flows/shell.html
@@ -1,7 +1,6 @@
-{% extends 'login/base_full.html' %}
+{% extends "base/skeleton.html" %}
 
 {% load static %}
-{% load i18n %}
 
 {% block head %}
 {{ block.super }}
@@ -14,7 +13,6 @@
 
 {% endblock %}
 
-{% block main_container %}
-
-
+{% block body %}
+
 {% endblock %}
diff --git a/web/rollup.config.js b/web/rollup.config.js
index cac99e8892..56ff673745 100644
--- a/web/rollup.config.js
+++ b/web/rollup.config.js
@@ -10,7 +10,7 @@ import externalGlobals from "rollup-plugin-external-globals";
 const resources = [
     { src: "node_modules/rapidoc/dist/rapidoc-min.js", dest: "dist/" },
 
-    { src: "node_modules/@patternfly/patternfly/patternfly.min.css", dest: "dist/" },
+    { src: "node_modules/@patternfly/patternfly/patternfly-base.css", dest: "dist/" },
     { src: "src/authentik.css", dest: "dist/" },
 
     { src: "node_modules/@patternfly/patternfly/assets/*", dest: "dist/assets/" },
diff --git a/web/src/authentik.css b/web/src/authentik.css
index 298b2d03a5..68d48904ff 100644
--- a/web/src/authentik.css
+++ b/web/src/authentik.css
@@ -62,11 +62,6 @@ html > input {
     background-position: center;
 }
 
-/* Fix spacing between messages */
-ak-message {
-    display: block;
-}
-
 .pf-m-success {
     color: var(--pf-global--success-color--100);
 }
diff --git a/web/src/elements/messages/MessageContainer.ts b/web/src/elements/messages/MessageContainer.ts
index fe7f1275e8..0588f13a80 100644
--- a/web/src/elements/messages/MessageContainer.ts
+++ b/web/src/elements/messages/MessageContainer.ts
@@ -1,5 +1,5 @@
 import { gettext } from "django";
-import { LitElement, html, customElement, TemplateResult, property, CSSResult } from "lit-element";
+import { LitElement, html, customElement, TemplateResult, property, CSSResult, css } from "lit-element";
 import "./Message";
 import { APIMessage } from "./Message";
 import PFAlertGroup from "@patternfly/patternfly/components/AlertGroup/alert-group.css";
@@ -24,7 +24,12 @@ export class MessageContainer extends LitElement {
     retryDelay = 200;
 
     static get styles(): CSSResult[] {
-        return [PFBase, PFAlertGroup];
+        return [PFBase, PFAlertGroup, css`
+            /* Fix spacing between messages */
+            ak-message {
+                display: block;
+            }
+        `];
     }
 
     constructor() {
diff --git a/web/src/flows/FlowExecutor.ts b/web/src/flows/FlowExecutor.ts
index 12183496ce..87e5e8cd2f 100644
--- a/web/src/flows/FlowExecutor.ts
+++ b/web/src/flows/FlowExecutor.ts
@@ -4,6 +4,9 @@ import { LitElement, html, customElement, property, TemplateResult, CSSResult, c
 import PFLogin from "@patternfly/patternfly/components/Login/login.css";
 import PFBase from "@patternfly/patternfly/patternfly-base.css";
 import PFTitle from "@patternfly/patternfly/components/Title/title.css";
+import PFBackgroundImage from "@patternfly/patternfly/components/BackgroundImage/background-image.css";
+import PFList from "@patternfly/patternfly/components/List/list.css";
+import AKGlobal from "../authentik.css";
 
 import { unsafeHTML } from "lit-html/directives/unsafe-html";
 import "./stages/authenticator_static/AuthenticatorStaticStage";
@@ -31,13 +34,15 @@ import { WebAuthnAuthenticatorRegisterChallenge } from "./stages/authenticator_w
 import { CaptchaChallenge } from "./stages/captcha/CaptchaStage";
 import { SpinnerSize } from "../elements/Spinner";
 import { StageHost } from "./stages/base";
-import { Challenge, ChallengeTypeEnum, FlowsApi } from "authentik-api";
+import { Challenge, ChallengeTypeEnum, Config, FlowsApi, RootApi } from "authentik-api";
 import { DEFAULT_CONFIG } from "../api/Config";
+import { ifDefined } from "lit-html/directives/if-defined";
+import { until } from "lit-html/directives/until";
 
 @customElement("ak-flow-executor")
 export class FlowExecutor extends LitElement implements StageHost {
-    @property()
-    flowSlug = "";
+
+    flowSlug: string;
 
     @property({attribute: false})
     challenge?: Challenge;
@@ -45,8 +50,11 @@ export class FlowExecutor extends LitElement implements StageHost {
     @property({type: Boolean})
     loading = false;
 
+    @property({ attribute: false })
+    config?: Config;
+
     static get styles(): CSSResult[] {
-        return [PFBase, PFLogin, PFTitle].concat(css`
+        return [PFBase, PFLogin, PFTitle, PFList, PFBackgroundImage, AKGlobal].concat(css`
             .ak-loading {
                 display: flex;
                 height: 100%;
@@ -75,6 +83,7 @@ export class FlowExecutor extends LitElement implements StageHost {
         this.addEventListener("ak-flow-submit", () => {
             this.submit();
         });
+        this.flowSlug = window.location.pathname.split("/")[2];
     }
 
     submit(formData?: T): Promise {
@@ -94,6 +103,9 @@ export class FlowExecutor extends LitElement implements StageHost {
     }
 
     firstUpdated(): void {
+        new RootApi(DEFAULT_CONFIG).rootConfigList().then((config) => {
+            this.config = config;
+        });
         this.loading = true;
         new FlowsApi(DEFAULT_CONFIG).flowsExecutorGetRaw({
             flowSlug: this.flowSlug
@@ -176,7 +188,7 @@ export class FlowExecutor extends LitElement implements StageHost {
         return html``;
     }
 
-    render(): TemplateResult {
+    renderChallengeWrapper(): TemplateResult {
         if (!this.challenge) {
             return this.renderLoading();
         }
@@ -185,4 +197,47 @@ export class FlowExecutor extends LitElement implements StageHost {
             ${this.renderChallenge()}
         `;
     }
+
+    render(): TemplateResult {
+        return html`
+            
+        
+        
+        
+            
+                
+                
+                    ${this.renderChallengeWrapper()}
+                
+                
+            
+