diff --git a/djblets/avatars/forms.py b/djblets/avatars/forms.py
index d91da4f5c0fb64c3df4d99cb032b7fd0d97af37f..f7e3a8bd7f29c9311f8cd7aa409781260b328c84 100644
--- a/djblets/avatars/forms.py
+++ b/djblets/avatars/forms.py
@@ -138,6 +138,19 @@ class AvatarSettingsForm(ConfigPageForm):
 
         avatar_service_id.initial = avatar_service.avatar_service_id
 
+        if self.request.method == 'POST':
+            kwargs['files'] = self.request.FILES
+
+        self.avatar_service_forms = {
+            service.avatar_service_id: service.config_form_class(
+                self.settings_manager.configuration_for(
+                    service.avatar_service_id),
+                prefix=service.avatar_service_id,
+                *args,
+                **kwargs)
+            for service in self.avatar_service_registry.configurable_services
+        }
+
     def clean_avatar_service_id(self):
         """Clean the avatar_service_id field.
 
@@ -179,22 +192,15 @@ class AvatarSettingsForm(ConfigPageForm):
                 Raised when the form for the selected avatar service is
                 invalid.
         """
-        self.cleaned_data = super(AvatarSettingsForm, self).clean()
+        super(AvatarSettingsForm, self).clean()
+
         avatar_service_id = self.cleaned_data['avatar_service_id']
         avatar_service = self.avatar_service_registry.get_avatar_service(
             avatar_service_id)
 
         if avatar_service.is_configurable:
-            config = self.settings_manager.configuration_for(avatar_service_id)
-            self._subform = avatar_service.config_form_class(
-                config, self.page, self.request, self.user,
-                data=self.request.POST, files=self.request.FILES)
-
-            if not self._subform.is_valid():
-                raise ValidationError(
-                    _('Invalid avatar service configuration.'))
-            else:
-                self.request._subform_errors = None
+            avatar_service_form = self.avatar_service_forms[avatar_service_id]
+            avatar_service_form.is_valid()
 
         return self.cleaned_data
 
@@ -225,8 +231,9 @@ class AvatarSettingsForm(ConfigPageForm):
         self.settings_manager.avatar_service_id = avatar_service_id
 
         if new_avatar_service.is_configurable:
+            avatar_service_form = self.avatar_service_forms[avatar_service_id]
             self.settings_manager.configuration[avatar_service_id] = \
-                self._subform.save()
+                avatar_service_form.save()
 
         self.settings_manager.save()
 
@@ -239,28 +246,9 @@ class AvatarSettingsForm(ConfigPageForm):
         """
         service = self.avatar_service_registry.for_user(self.user)
 
-        config_forms = {}
-
-        for service in self.avatar_service_registry.enabled_services:
-            if service.is_configurable:
-                config = self.settings_manager.configuration_for(
-                    service.avatar_service_id)
-
-                config_forms[service.avatar_service_id] = \
-                    service.config_form_class(config, self.page, self.request,
-                                              self.user)
-
-        # We previously cached the selected avatar service's configuration form
-        # in clean(). Now, we update the errors dictionary of our newly created
-        # sub-form so that validation errors can be displayed to the user.
-        if hasattr(self, '_subform'):
-            config_forms[self._subform.avatar_service_id].errors.update(
-                self._subform.errors)
-
         return {
             'current_avatar_service': service,
             'avatar_services': self.avatar_service_registry.enabled_services,
-            'forms': config_forms,
         }
 
     def get_js_model_data(self):
diff --git a/djblets/avatars/registry.py b/djblets/avatars/registry.py
index d8c446c69a94e76ba0fa4c5865bcc7b4380478fb..c069a8b6806c749194ab63c29be1bbd48c636b62 100644
--- a/djblets/avatars/registry.py
+++ b/djblets/avatars/registry.py
@@ -397,7 +397,7 @@ class AvatarServiceRegistry(Registry):
         most cases.
         """
         for service_class in self.default_avatar_service_classes:
-            yield service_class()
+            yield service_class(self.settings_manager_class)
 
     def save(self):
         """Save the list of enabled avatar services to the database."""
diff --git a/djblets/avatars/services/file_upload.py b/djblets/avatars/services/file_upload.py
index 466752bb143169b9cd31aabdc46f35fa4f2e5005..c230b05f90a2c7eb8181572f980c0bdbb0a869b8 100644
--- a/djblets/avatars/services/file_upload.py
+++ b/djblets/avatars/services/file_upload.py
@@ -55,6 +55,7 @@ class FileUploadAvatarForm(AvatarServiceConfigForm):
             The avatar service configuration.
         """
         storage = DefaultStorage()
+
         file_path = self.cleaned_data['avatar_upload'].name
         file_path = storage.get_valid_name(file_path)
 
diff --git a/djblets/avatars/templates/avatars/settings_form.html b/djblets/avatars/templates/avatars/settings_form.html
index ccedf3bf2565e0c920775053b581e198de78c334..5f943a3d3f2a349c0c4b8595b5b2dca4dc2e2fe5 100644
--- a/djblets/avatars/templates/avatars/settings_form.html
+++ b/djblets/avatars/templates/avatars/settings_form.html
@@ -1,7 +1,6 @@
 {% load djblets_forms djblets_utils i18n %}
 
 {% block pre_fields %}{% endblock %}
-
 {{form.non_field_errors}}
 
 {% for field in form %}
@@ -17,16 +16,15 @@
  </div>
 </div>
 
-{% for service_id, form in forms.items %}
+{% for service_id, form in form.avatar_service_forms.items %}
 <div class="avatar-service-fields" data-avatar-service-id="{{service_id}}">
  {{form.render|safe}}
 </div>
 {% endfor %}
-
 <script>
 $().ready(function() {
     Djblets.Avatars.SettingsFormView.ready.then(function() {
-{% for service_id, form in forms.items %}
+{% for service_id, form in form.avatar_service_forms.items %}
         Djblets.Avatars.SettingsFormView.addConfigForm('{{service_id}}', {{form.js_view_class}});
 {% endfor %}
         Djblets.Avatars.SettingsFormView.instance.renderForms();
diff --git a/djblets/static/djblets/js/avatars/views/avatarSettingsFormView.es6.js b/djblets/static/djblets/js/avatars/views/avatarSettingsFormView.es6.js
index 21084c86cf1734d38fad1cb640dc60a362feeb02..6c57600d5f3b84fe901cab2ac1bfbeb917082ecf 100644
--- a/djblets/static/djblets/js/avatars/views/avatarSettingsFormView.es6.js
+++ b/djblets/static/djblets/js/avatars/views/avatarSettingsFormView.es6.js
@@ -12,7 +12,7 @@ const [readyPromise, resolve] = Promise.withResolver();
  */
 Djblets.Avatars.SettingsFormView = Backbone.View.extend({
     events: {
-        'change select[name="avatar_service_id"]': '_onServiceChanged',
+        'change #id_avatar_service_id': '_onServiceChanged',
         'submit': '_onSubmit'
     },
 
@@ -67,7 +67,11 @@ Djblets.Avatars.SettingsFormView = Backbone.View.extend({
             form.render();
         }
 
-        const serviceID = this.model.get('serviceID');
+        /*
+         * Ensure that if the browser sets the value of the <select> upon
+         * refresh that we update the model accordingly.
+         */
+        this.$('#id_avatar_service_id').change();
         this._showHideForms(true);
 
         return this;
diff --git a/djblets/static/djblets/js/avatars/views/fileUploadSettingsFormView.es6.js b/djblets/static/djblets/js/avatars/views/fileUploadSettingsFormView.es6.js
index c30ff6326b7e09f99d38ee5851ec923f1cc8e886..254ba86a6123f65bf07157a5f487bd18188e24cc 100644
--- a/djblets/static/djblets/js/avatars/views/fileUploadSettingsFormView.es6.js
+++ b/djblets/static/djblets/js/avatars/views/fileUploadSettingsFormView.es6.js
@@ -13,7 +13,7 @@ const allowedMimeTypes = [
  */
 Djblets.Avatars.FileUploadSettingsFormView = Djblets.Avatars.ServiceSettingsFormView.extend({
     events: {
-        'change #id_avatar_upload': '_onFileChanged'
+        'change #id_file-upload-avatar_upload': '_onFileChanged'
     },
 
 
@@ -23,7 +23,7 @@ Djblets.Avatars.FileUploadSettingsFormView = Djblets.Avatars.ServiceSettingsForm
      * If a file is selected, ensure it is has the correct MIME type.
      */
     validate() {
-        const file = this.$('#id_avatar_upload')[0].files[0];
+        const file = this.$('#id_file-upload-avatar_upload')[0].files[0];
 
         if (!file) {
             alert(gettext('You must choose a file.'));
@@ -34,6 +34,8 @@ Djblets.Avatars.FileUploadSettingsFormView = Djblets.Avatars.ServiceSettingsForm
             alert(gettext('Invalid file format'));
             return false;
         }
+
+        return true;
     },
 
     /**
