diff --git a/com.woltlab.wcf/defaultStyle.tar b/com.woltlab.wcf/defaultStyle.tar
index e519df514ac..268e6e1bc06 100644
Binary files a/com.woltlab.wcf/defaultStyle.tar and b/com.woltlab.wcf/defaultStyle.tar differ
diff --git a/com.woltlab.wcf/package.xml b/com.woltlab.wcf/package.xml
index 7e7e5e9fe4a..d4f63a11a66 100644
--- a/com.woltlab.wcf/package.xml
+++ b/com.woltlab.wcf/package.xml
@@ -74,6 +74,7 @@
because deleting the legacy condition object types cascades to `wcf1_condition`.
acp/update_com.woltlab.wcf_6.3_styleTemplateGroup.php
+ acp/update_com.woltlab.wcf_6.3_styleVariables.php
acp/database/update_com.woltlab.wcf_6.3_step2.php
acp/update_com.woltlab.wcf_6.3_embeddedObjects.php
diff --git a/com.woltlab.wcf/templates/__devtoolsLanguageChooser.tpl b/com.woltlab.wcf/templates/__devtoolsLanguageChooser.tpl
index 372fbf0fc0b..9183c08f0ed 100644
--- a/com.woltlab.wcf/templates/__devtoolsLanguageChooser.tpl
+++ b/com.woltlab.wcf/templates/__devtoolsLanguageChooser.tpl
@@ -1,4 +1,5 @@
-{if ENABLE_DEBUG_MODE && ENABLE_DEVELOPER_TOOLS && !$__wcf->user->isGuest()}
+{* The `system_pageHeader` renders this chooser on the server. *}
+{if ENABLE_DEBUG_MODE && ENABLE_DEVELOPER_TOOLS && !$__wcf->user->isGuest() && $__wcf->getStyleHandler()->getStyle()->usesClassicPageHeader()}
diff --git a/com.woltlab.wcf/templates/system_pageHeader.tpl b/com.woltlab.wcf/templates/system_pageHeader.tpl
new file mode 100644
index 00000000000..60df40a0d9e
--- /dev/null
+++ b/com.woltlab.wcf/templates/system_pageHeader.tpl
@@ -0,0 +1,71 @@
+{assign var='__pageHeaderLayout' value=$__wcf->getStyleHandler()->getStyle()->getVariable('pageHeaderLayout')}
+
diff --git a/com.woltlab.wcf/templates/system_pageHeaderLogo.tpl b/com.woltlab.wcf/templates/system_pageHeaderLogo.tpl
new file mode 100644
index 00000000000..a91a1efeb4e
--- /dev/null
+++ b/com.woltlab.wcf/templates/system_pageHeaderLogo.tpl
@@ -0,0 +1,19 @@
+
diff --git a/com.woltlab.wcf/templates/system_pageHeaderMenu.tpl b/com.woltlab.wcf/templates/system_pageHeaderMenu.tpl
new file mode 100644
index 00000000000..b5ea7ded8fe
--- /dev/null
+++ b/com.woltlab.wcf/templates/system_pageHeaderMenu.tpl
@@ -0,0 +1,116 @@
+{* The variables of `__menu` are required by its template listeners, see `TemplateEngine::SYSTEM_TEMPLATE_LISTENER_ALIASES`. *}
+{assign var='menuIdentifier' value='com.woltlab.wcf.MainMenu'}
+{assign var='__mainMenu' value=$__wcf->getBoxHandler()->getBoxByIdentifier($menuIdentifier)->getMenu()}
+{assign var='menuItemNodeList' value=$__mainMenu->getMenuItemNodeList()}
+{assign var='menuTitle' value=$__mainMenu->getTitle()}
+
+
+ {lang}wcf.menu.page{/lang}
+
+ {icon size=24 name='xmark'}
+
+
+
+ {if $__wcf->user->isGuest()}
+
+ {/if}
+
+ "|str_repeat:$menuItemNode->getOpenParentNodes()}
+ {/if}
+ {/foreach}
+
+ {event name='menuAfter'}
+
+ {* Receives the items that do not fit into the bar, the overflow detection runs on the client. *}
+
+
+
+ {icon name='chevron-down' type='solid'}
+
+
+
+
+
+ {if $__wcf->user->isGuest() && $__wcf->getLanguage()->getLanguages()|count > 1}
+
+
+ {lang}wcf.user.language{/lang}
+ {$__wcf->getLanguage()}
+ {icon name='chevron-down' type='solid'}
+
+
+ {foreach from=$__wcf->getLanguage()->getLanguages() item=_language}
+
+ languageID === $__wcf->getLanguage()->languageID} aria-current="true"{/if}
+ >
+
+ {$_language}
+
+
+ {/foreach}
+
+
+ {/if}
+
+ {assign var='__footerMenuBox' value=$__wcf->getBoxHandler()->getBoxByIdentifier('com.woltlab.wcf.FooterMenu')}
+ {if $__footerMenuBox !== null && $__footerMenuBox->hasContent()}
+
+ {foreach from=$__footerMenuBox->getMenu()->getMenuItemNodeList() item=menuItemNode}
+ {if $menuItemNode->getDepth() === 1}
+ getURL()}>{$menuItemNode->getTitle()}
+ {/if}
+ {/foreach}
+
+ {/if}
+
diff --git a/com.woltlab.wcf/templates/system_pageHeaderSearch.tpl b/com.woltlab.wcf/templates/system_pageHeaderSearch.tpl
new file mode 100644
index 00000000000..96c0b360505
--- /dev/null
+++ b/com.woltlab.wcf/templates/system_pageHeaderSearch.tpl
@@ -0,0 +1,70 @@
+{if $__searchTypeLabel|empty}
+ {capture assign='__searchTypeLabel'}{lang}wcf.search.type.{if !$__searchObjectTypeName|empty}{$__searchObjectTypeName}{else}everywhere{/if}{/lang}{/capture}
+{/if}
+
+{if MODULE_ARTICLE && SEARCH_ENABLE_ARTICLES && $__wcf->getActivePage() != null && ($__wcf->getActivePage()->identifier == 'com.woltlab.wcf.ArticleList' || $__wcf->getActivePage()->identifier == 'com.woltlab.wcf.CategoryArticleList' || $__wcf->getActivePage()->identifier == 'com.woltlab.wcf.Article')}
+ {if $category|isset}
+ {capture assign='__searchTypeLabel'}{$category->getTitle()}{/capture}
+ {else}
+ {capture assign='__searchTypeLabel'}{lang}wcf.search.type.com.woltlab.wcf.article{/lang}{/capture}
+ {/if}
+
+ {assign var='__searchObjectTypeName' value='com.woltlab.wcf.article'}
+
+ {capture assign='__searchTypesScoped'}
+ {if $category|isset}