diff --git a/djblets/extensions/base.py b/djblets/extensions/base.py
index f1188c308bc66e8e81eb4cfa8e7e79cfa6bb8543..0d822ae5fd76a3cd2376f5f99e27156ab5dfde6a 100644
--- a/djblets/extensions/base.py
+++ b/djblets/extensions/base.py
@@ -110,6 +110,9 @@ class Settings(dict):
 
         return key in self.extension.default_settings
 
+    def set(self, key, value):
+        self[key] = value
+
     def load(self):
         """Loads the settings from the database."""
         try:
@@ -478,7 +481,7 @@ class ExtensionManager(object):
         being enabled.
 
         If this is called a second time, it will refresh the list of
-        extensions, adding new ones and removing deleted ones.o
+        extensions, adding new ones and removing deleted ones.
 
         If full_reload is passed, all state is cleared and we reload all
         extensions and state from scratch.
diff --git a/djblets/extensions/forms.py b/djblets/extensions/forms.py
index c399050c6f20d8f0a02323d77436a01b7addf88f..ad5fbfd5075ba565a96c1608c3908a7bf7d6a2b6 100644
--- a/djblets/extensions/forms.py
+++ b/djblets/extensions/forms.py
@@ -25,8 +25,10 @@
 
 from django import forms
 
+from djblets.siteconfig.forms import SiteSettingsForm
 
-class SettingsForm(forms.Form):
+
+class SettingsForm(SiteSettingsForm):
     """Settings form for extension configuration.
 
     A base form for loading/saving settings for an extension. This is meant
@@ -34,16 +36,6 @@ class SettingsForm(forms.Form):
     defined by the form will be loaded and saved automatically.
     """
     def __init__(self, extension, *args, **kwargs):
-        forms.Form.__init__(self, *args, **kwargs)
         self.extension = extension
 
-        for field in self.fields:
-            if field in self.extension.settings:
-                self.fields[field].initial = self.extension.settings[field]
-
-    def save(self):
-        if not self.errors:
-            for key, value in self.cleaned_data.iteritems():
-                self.extension.settings[key] = value
-
-            self.extension.settings.save()
+        super(SettingsForm, self).__init__(extension.settings, *args, **kwargs)
diff --git a/djblets/extensions/templates/extensions/configure_extension.html b/djblets/extensions/templates/extensions/configure_extension.html
index c9298c0507c71146d0d3075d6d167e356c8143b1..618f7318b18ad9d9b72a67b961db27de8b3cf3b4 100644
--- a/djblets/extensions/templates/extensions/configure_extension.html
+++ b/djblets/extensions/templates/extensions/configure_extension.html
@@ -1,62 +1,11 @@
-{% extends "admin/base_site.html" %}
-{% load adminmedia admin_list djblets_forms djblets_utils i18n staticfiles %}
+{% extends "siteconfig/settings.html" %}
+{% load djblets_utils i18n %}
 
 {% block title %}
-{%  if enabled %}
-{% blocktrans with extension.info.name as name %}Configure {{name}}{% endblocktrans %}
-{%  else %}
-{% trans "Invalid Extension" %}
-{%  endif %}
+{%  blocktrans with extension.info.name as name %}Configure {{name}}{% endblocktrans %}
 {{block.super}}
 {% endblock %}
 
-{% block extrahead %}
-<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" />
-<link rel="stylesheet" type="text/css" href="{% static "djblets/css/admin.css" %}" />
-{{block.super}}
-{% endblock %}
-
-{% block content %}
-<div id="content-main">
- <h1 class="title">{% blocktrans with extension.info.name as name %}Configure {{name}}{% endblocktrans %}</h1>
-
-{%  if form.error_dict %}
- <p class="errornote">
-  {% blocktrans count form.error_dict.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
- </p>
-{%  endif %}
-
-
-{%  if enabled %}
-{%   if extension.is_configurable %}
- <form action="." method="post"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
-  <fieldset class="module aligned">
-   <h2>{% blocktrans with extension.info.name as name %}{{name}} Settings{% endblocktrans %}</h2>
-{%   for field in form %}
-{%    if field.is_hidden %}
-   {{field}}
-{%    else %}
-{%     with field|form_field_has_label_first as label_first %}
-   <div class="form-row{% if not label_first %} checkbox-row{% endif%}{% if field.errors %} error{% endif %}">
-    {{field.errors}}
-    {% if not label_first %}{{field}}{% endif %}
-    {% label_tag field %}
-    {% if label_first %}{{field}}{% endif %}
-    {% if field.help_text %}<p class="help">{{field.help_text}}</p>{% endif %}
-   </div>
-{%     endwith %}
-{%    endif %}
-{%   endfor %}
-  </fieldset>
-  <div class="submit-row">
-   <input type="submit" value="{% trans "Save" %}" class="default" />
-  </div>
- </form>
-{%   else %}
-<p>{% trans "This extension is not configurable." %}</p>
-{%   endif %}
-{%  else %}
-<p>{% trans "This extension is not enabled." %}</p>
-{%  endif %}
-</div>
+{% block form_title %}
+{%  blocktrans with extension.info.name as name %}Configure {{name}}{% endblocktrans %}
 {% endblock %}
diff --git a/djblets/extensions/views.py b/djblets/extensions/views.py
index a397b56a2d2f817a2ffbc6e2c1060754bceeea13..9c8f93e7c9982a66a708d9f3ae0161b16021c6d6 100644
--- a/djblets/extensions/views.py
+++ b/djblets/extensions/views.py
@@ -24,6 +24,7 @@
 # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 from django.contrib.admin.views.decorators import staff_member_required
+from django.http import Http404, HttpResponseRedirect
 from django.shortcuts import render_to_response
 from django.template.context import RequestContext
 
@@ -59,25 +60,23 @@ def extension_list(request, extension_manager,
 @staff_member_required
 def configure_extension(request, ext_class, form_class, extension_manager,
                         template_name='extensions/configure_extension.html'):
-    context = {}
-    form = None
     extension = extension_manager.get_enabled_extension(ext_class.id)
 
-    if extension:
-        context['extension'] = extension
-        context['enabled'] = True
+    if not extension or not extension.is_configurable:
+        raise Http404
 
-        if extension.is_configurable:
-            if request.method == 'POST':
-                form = form_class(extension, request.POST, request.FILES)
+    if request.method == 'POST':
+        form = form_class(extension, request.POST, request.FILES)
 
-                if form.is_valid():
-                    form.save()
-            else:
-                form = form_class(extension)
+        if form.is_valid():
+            form.save()
 
-            context['form'] = form
+            return HttpResponseRedirect(request.path + '?saved=1')
     else:
-        context['enabled'] = False
+        form = form_class(extension)
 
-    return render_to_response(template_name, RequestContext(request, context))
+    return render_to_response(template_name, RequestContext(request, {
+        'extension': extension,
+        'form': form,
+        'saved': request.GET.get('saved', 0),
+    }))
diff --git a/djblets/siteconfig/forms.py b/djblets/siteconfig/forms.py
index 738a640722db0ba3a2c3b38b0d41c16022146fc6..4425a0bf8b879a117ecaa479652928d0fc571559 100644
--- a/djblets/siteconfig/forms.py
+++ b/djblets/siteconfig/forms.py
@@ -63,9 +63,11 @@ class SiteSettingsForm(forms.Form):
         if not self.errors:
             if hasattr(self, "Meta"):
                 save_blacklist = getattr(self.Meta, "save_blacklist", [])
+            else:
+                save_blacklist = []
 
             for key, value in self.cleaned_data.iteritems():
                 if key not in save_blacklist:
-                    self.siteconfig.settings[key] = value
+                    self.siteconfig.set(key, value)
 
             self.siteconfig.save()
diff --git a/djblets/siteconfig/templates/siteconfig/settings.html b/djblets/siteconfig/templates/siteconfig/settings.html
index 260a8887ff76a2c23f443769f21e41714093a8e3..51de34a3cdb8abf643a050b9b43e0841951103d4 100644
--- a/djblets/siteconfig/templates/siteconfig/settings.html
+++ b/djblets/siteconfig/templates/siteconfig/settings.html
@@ -24,7 +24,7 @@
  </ul>
 {% endif %}
 
- <h1 class="title">{{form.Meta.title}}</h1>
+ <h1 class="title">{% block form_title %}{{form.Meta.title}}{% endblock %}</h1>
 
 <div id="content-main">
  <form action="." method="post"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
