diff --git a/com.woltlab.wcf/fileDelete.xml b/com.woltlab.wcf/fileDelete.xml
index 3336abf1ebc..0bf2d4c5bb3 100644
--- a/com.woltlab.wcf/fileDelete.xml
+++ b/com.woltlab.wcf/fileDelete.xml
@@ -1681,6 +1681,7 @@
lib/data/user/option/IUserOptionOutput.class.php
lib/data/user/option/UserOptionOutput.class.php
lib/form/AbstractSecureForm.class.php
+ lib/form/AvatarEditForm.class.php
lib/form/Form.class.php
lib/form/MailForm.class.php
lib/form/MultifactorAuthenticationAbortForm.class.php
@@ -2999,6 +3000,8 @@
lib/system/template/plugin/TemplatePluginPrefilterIcon.class.php
lib/system/template/plugin/TemplatePluginPrefilterLang.class.php
lib/system/template/plugin/WordwrapModifierTemplatePlugin.class.php
+ lib/system/upload/AvatarUploadFileSaveStrategy.class.php
+ lib/system/upload/AvatarUploadFileValidationStrategy.class.php
lib/system/user/UserCollapsibleContentHandler.class.php
lib/system/user/activity/point/AbstractUserActivityPointObjectProcessor.class.php
lib/system/user/activity/point/DefaultUserActivityPointObjectProcessor.class.php
diff --git a/com.woltlab.wcf/objectType.xml b/com.woltlab.wcf/objectType.xml
index 9472239439d..567b539407f 100644
--- a/com.woltlab.wcf/objectType.xml
+++ b/com.woltlab.wcf/objectType.xml
@@ -1744,6 +1744,11 @@
com.woltlab.wcf.file
wcf\system\file\processor\AttachmentFileProcessor
+
+ com.woltlab.wcf.user.avatar
+ com.woltlab.wcf.file
+ wcf\system\file\processor\UserAvatarFileProcessor
+
com.woltlab.wcf.page.controller
diff --git a/com.woltlab.wcf/page.xml b/com.woltlab.wcf/page.xml
index 59b2f271b06..856395a425c 100644
--- a/com.woltlab.wcf/page.xml
+++ b/com.woltlab.wcf/page.xml
@@ -100,20 +100,6 @@
Benutzerkonto-Sicherheit
-
- system
- wcf\form\AvatarEditForm
- Avatar-Verwaltung
- Avatar Management
- 1
- com.woltlab.wcf.AccountManagement
-
- Avatar Management
-
-
- Avatar-Verwaltung
-
-
system
wcf\form\EmailActivationForm
@@ -888,6 +874,7 @@ E-Mail: [E-Mail-Adresse der verantwortlichen Stelle]
Verantwortliche Stell
+
diff --git a/com.woltlab.wcf/templateDelete.xml b/com.woltlab.wcf/templateDelete.xml
index b173661dd97..7198bdb3fa6 100644
--- a/com.woltlab.wcf/templateDelete.xml
+++ b/com.woltlab.wcf/templateDelete.xml
@@ -117,5 +117,6 @@
__multilineItemListFormField
email_notification_userRegistration
imageViewer
+ avatarEdit
diff --git a/com.woltlab.wcf/templates/avatarEdit.tpl b/com.woltlab.wcf/templates/avatarEdit.tpl
deleted file mode 100644
index 45fc6bd46e6..00000000000
--- a/com.woltlab.wcf/templates/avatarEdit.tpl
+++ /dev/null
@@ -1,82 +0,0 @@
-{include file='userMenuSidebar'}
-
-{include file='header' __disableAds=true __sidebarLeftHasMenu=true}
-
-{if $__wcf->user->disableAvatar}
- {lang}wcf.user.avatar.error.disabled{/lang}
-{/if}
-
-{include file='shared_formError'}
-
-{if $success|isset}
- {lang}wcf.global.success.edit{/lang}
-{/if}
-
-
-
-{if $__wcf->getSession()->getPermission('user.profile.avatar.canUploadAvatar')}
-
-{/if}
-
-{include file='footer'}
diff --git a/com.woltlab.wcf/templates/shared_fileProcessorFormField.tpl b/com.woltlab.wcf/templates/shared_fileProcessorFormField.tpl
index b4dba63d9d8..d57b84d4845 100644
--- a/com.woltlab.wcf/templates/shared_fileProcessorFormField.tpl
+++ b/com.woltlab.wcf/templates/shared_fileProcessorFormField.tpl
@@ -24,6 +24,9 @@
'{unsafe:$field->getPrefixedId()|encodeJS}',
{if $field->isSingleFileUpload()}true{else}false{/if},
{if $field->isBigPreview()}true{else}false{/if},
+ {if $field->isSimpleReplace()}true{else}false{/if},
+ {if $field->isHideDeleteButton()}true{else}false{/if},
+ {if $field->getThumbnailSize() === null}undefined{else}'{$field->getThumbnailSize()|encodeJS}'{/if},
[{implode from=$actionButtons item=actionButton}{
title: '{unsafe:$actionButton['title']|encodeJS}',
icon: {if $actionButton['icon'] === null}undefined{else}'{unsafe:$actionButton['icon']->toHtml()|encodeJS}'{/if},
diff --git a/com.woltlab.wcf/templates/user.tpl b/com.woltlab.wcf/templates/user.tpl
index 99fbb3eac0e..328e48f0542 100644
--- a/com.woltlab.wcf/templates/user.tpl
+++ b/com.woltlab.wcf/templates/user.tpl
@@ -49,7 +49,7 @@
'wcf.user.activityPoint': '{jslang}wcf.user.activityPoint{/jslang}'
});
{/if}
-
+
{if $user->canEdit() || ($__wcf->getUser()->userID == $user->userID && $user->canEditOwnProfile())}
WCF.Language.addObject({
'wcf.user.editProfile': '{jslang}wcf.user.editProfile{/jslang}'
diff --git a/com.woltlab.wcf/templates/userProfileHeader.tpl b/com.woltlab.wcf/templates/userProfileHeader.tpl
index 86b64a20498..3a9fe00d0b6 100644
--- a/com.woltlab.wcf/templates/userProfileHeader.tpl
+++ b/com.woltlab.wcf/templates/userProfileHeader.tpl
@@ -39,6 +39,12 @@
{/if}
+ {if $view->user->canEditAvatar()}
+
+ {/if}
+
{if $view->canEditUser()}
{/if}
@@ -51,7 +57,7 @@