diff --git a/docs/manual/admin/index.txt b/docs/manual/admin/index.txt
index 4e1093474ec692f9719007936e489533f48b2fe6..83f38691f2e08afd61ff029269fd1dc9859bfd2b 100644
--- a/docs/manual/admin/index.txt
+++ b/docs/manual/admin/index.txt
@@ -11,5 +11,6 @@ Administration Guide
    sites/index
    admin-ui/index
    management/index
+   templates/index
 
 .. comment: vim: ft=rst et
diff --git a/docs/manual/admin/templates/index.txt b/docs/manual/admin/templates/index.txt
new file mode 100644
index 0000000000000000000000000000000000000000..26c729ad320dcb85a96f9a05ed5f069a05f4f4fe
--- /dev/null
+++ b/docs/manual/admin/templates/index.txt
@@ -0,0 +1,10 @@
+==================
+Template Extension
+==================
+
+.. toctree::
+    :maxdepth: 2
+
+    template-extension
+
+.. comment: vim: ft=rst et
diff --git a/docs/manual/admin/templates/template-extension.txt b/docs/manual/admin/templates/template-extension.txt
new file mode 100644
index 0000000000000000000000000000000000000000..df5fd123f9cb5aed79f7021f2d7e2d402b56a8ab
--- /dev/null
+++ b/docs/manual/admin/templates/template-extension.txt
@@ -0,0 +1,119 @@
+===================
+Extending Templates
+===================
+
+Extending the Review Board templates is a simple way to add custom components/style to
+the website.
+
+Templates can be found in the :file:`reviewboard/templates` directory.
+
+Steps
+-----
+1. Navigate to the directory of the template to extend (within reviewboard/templates)
+2. Create a new text file with a name in the format :file:`originalTemplate_extended.html`.
+3. Inside the extended template file add the tag::
+
+    {% extends "reviewboard/pathToTemplateFromTheTemplateDirectory/originalTemplate.html" %}
+
+4. If you open the :file:`originalTemplate.html` throughout the file you will see block tags
+   in the form::
+
+    {% block blockName %}
+
+5. Add the opening block tag after the extension tag::
+
+    {% extends "reviewboard/pathToTemplateFromTheTemplateDirectory/originalTemplate.html" %}
+    ...
+    {% block blockName %}
+
+.. note::     You can extend as many blocks as you want from the original as long as it has a
+              properly nested matching endblock tag.
+
+6. Add a closing block tag at the end of the extension file::
+
+    {% extends "reviewboard/pathToTemplateFromTheTemplateDirectory/originalTemplate.html" %}
+    ...
+    {% block blockName %}
+    ...
+    {% endblock %}
+
+7. Add the call to the super-block's constructor to add in all of the original block's content::
+
+    {% extends "reviewboard/pathToTemplateFromTheTemplateDirectory/originalTemplate.html" %}
+    ...
+    {% block blockNam %}
+    ...
+    {{block.super}}
+    ...
+    {% endblock %}
+
+8. Add any desired html inside the block tags::
+
+    {% block blockName %}
+    // desired code before the original
+    {{block.super}}
+    // desired code after the original
+    {% endblock %}
+
+9. Save the extension file.
+
+Example - extending dashboard_manage.html
+-----------------------------------------
+1. :file:`dashboard_manage.html` is in the directory :file:`reviewboard/templates/admin/dashboard`.
+
+2. Create :file:`dashboard_manage_extended.html` in :file:`reviewboard/templates/admin/dashboard`.
+
+3. Open dashboard_manage_extended.html and add the following extension tag::
+
+    {% extends "reviewboard/admin/dashboard.html" %}
+
+.. note:: You do not need to include the :file:`templates/` to the path.
+
+4. Open the dashboard_manage.html file to get the appropriate block tag::
+
+    {% block manage %}
+
+5. Add the block tag to the extension file (under the extends tag)::
+
+    {% extends "reviewboard/admin/dashboard.html" %}
+
+    {% block manage %}
+
+6. Add the endblock tag to the end of the extension file::
+
+    {% extends "reviewboard/admin/dashboard.html" %}
+
+    {% block manage %}
+    {% endblock %}
+
+7. Add the call to the super-block's constructor inside the block tags::
+
+    {% extends "reviewboard/admin/dashboard.html" %}
+
+    {% block manage %}
+    {{block.super}}
+    {% endblock %}
+
+8. Add the desired html extension::
+
+    {% extends "reviewboard/admin/dashboard.html" %}
+
+    {% block manage %}
+    {{block.super}}
+      <h1>Hello, World!</h1>
+    {% endblock %}
+
+9. Save the extension file.
+
+When the admin/dashboard_manage.html template is next loaded the extension
+will load in its place and the text Hello, World! will appear after the
+original content.
+
+Overriding Templates
+--------------------
+Overriding a template involves the same process as extension, only no call
+to {{block.super}} would be required. This could be used for changing the
+banner image to be displayed for example.
+
+
+.. comment: vim: ft=rst et
diff --git a/docs/manual/contents.txt b/docs/manual/contents.txt
index ca1a43ecc562c894d12fb36ab4cff32bf0297652..c2fd5077865562760847a1d30260a763385be7c2 100644
--- a/docs/manual/contents.txt
+++ b/docs/manual/contents.txt
@@ -12,7 +12,6 @@ Table of Contents
    webapi/index
    faq/index
 
-
 Indices, glossary and tables
 ============================
 
diff --git a/reviewboard/settings.py b/reviewboard/settings.py
index e313e4efb074712102238570f164009cadd2c819..566366cfd83a8a052da54ee387d61c4992870072 100644
--- a/reviewboard/settings.py
+++ b/reviewboard/settings.py
@@ -37,6 +37,7 @@ LANGUAGES = (
 
 # List of callables that know how to import templates from various sources.
 TEMPLATE_LOADERS = (
+    'reviewboard.template_loader.ExtensionLoader',
     'django.template.loaders.filesystem.Loader',
     'django.template.loaders.app_directories.Loader',
 )
diff --git a/reviewboard/template_loader.py b/reviewboard/template_loader.py
new file mode 100644
index 0000000000000000000000000000000000000000..128fcb684426d6b51ed38809af897362ed3f5ac6
--- /dev/null
+++ b/reviewboard/template_loader.py
@@ -0,0 +1,28 @@
+from django.conf import settings
+from django.template import Template
+from django.template.loaders import app_directories
+
+
+class ExtensionLoader(app_directories.Loader):
+    is_usable = True
+
+    def load_template(self, template_name, template_dirs=None):
+        """
+        Template loader that loads extended templates.
+
+        This loader searches for templates in the form original_extended.html.
+        """
+
+        template_dirs = getattr(settings, "TEMPLATE_DIRS", [])
+
+        # If the path starts with reviewboard/ then this is an extended template
+        # that is including a default template. In this case load the default
+        # otherwise try to load an extended version first.
+        if template_name.startswith("reviewboard/"):
+            template_name = template_name.replace("reviewboard/", "")
+        else:
+            template_name = template_name.replace(".html", "_extended.html")
+
+        source, origin = self.load_template_source(template_name, template_dirs)
+        template = Template(source)
+        return template, origin
diff --git a/reviewboard/templates/accounts/prefs.html b/reviewboard/templates/accounts/prefs.html
index de60fbcf8c409ed1a4dbe1e1168889d75c215b55..11f78225e772a005a3370a46ebd31fffbe111654 100644
--- a/reviewboard/templates/accounts/prefs.html
+++ b/reviewboard/templates/accounts/prefs.html
@@ -10,38 +10,7 @@
  <h1 class="title">{% trans "User Preferences" %}</h1>
  <div class="main">
   <table>
-{% if auth_backends.0.supports_change_name %}
-   <tr>
-    <td><label for="id_first_name">{% trans "First Name:" %}</label></td>
-    <td>{{form.first_name}}</td>
-   </tr>
-   <tr>
-    <td><label for="id_last_name">{% trans "Last Name:" %}</label></td>
-    <td>{{form.last_name}}</td>
-   </tr>
-{% endif %}
-{% if auth_backends.0.supports_change_email %}
-   <tr>
-    <td><label for="id_email">{% trans "Email:" %}</label></td>
-    <td>{{form.email}} {{form.errors.email}}</td>
-   </tr>
-{% endif %}
-{% if auth_backends.0.supports_change_password %}
-   <tr>
-    <td><label for="id_password">{% trans "Change Password:" %}</label></td>
-    <td>{{form.password1}}</td>
-   </tr>
-   <tr>
-    <td><label for="id_password2">{% trans "Verify New Password:" %}</label></td>
-    <td>{{form.password2}} {{form.errors.password2}}</td>
-   </tr>
-{% endif %}
-{% if siteconfig.settings.diffviewer_syntax_highlighting %}
-   <tr>
-    <td></td>
-    <td>{{form.syntax_highlighting}} {{form.syntax_highlighting.label}}</td>
-   </tr>
-{% endif %}
+{% include "accounts/prefs/prefs_users.html" %}
   </table>
  </div>
 {% endbox %}
@@ -49,8 +18,7 @@
 {% box "prefsgroup" %}
  <h1 class="title">{% trans "Groups" %}</h1>
  <div class="main">
-  <p>{% trans "Which groups do you belong to or wish to watch?" %}</p>
-  {{form.groups}}
+{% include "accounts/prefs/prefs_groups.html" %}
  </div>
 {% endbox %}
 {% endif %}
diff --git a/reviewboard/templates/accounts/prefs/prefs_groups.html b/reviewboard/templates/accounts/prefs/prefs_groups.html
new file mode 100644
index 0000000000000000000000000000000000000000..84af1e9fe375ee4127472d21786d31da72eb21a1
--- /dev/null
+++ b/reviewboard/templates/accounts/prefs/prefs_groups.html
@@ -0,0 +1,10 @@
+{# Group account preferences. #}
+
+{% load i18n %}
+
+{% block content %}
+
+<p>{% trans "Which groups do you belong to or wish to watch?" %}</p>
+{{form.groups}}
+
+{% endblock %}
diff --git a/reviewboard/templates/accounts/prefs/prefs_users.html b/reviewboard/templates/accounts/prefs/prefs_users.html
new file mode 100644
index 0000000000000000000000000000000000000000..e9f4ee145f78a54e7cb452037b80cad7325fb816
--- /dev/null
+++ b/reviewboard/templates/accounts/prefs/prefs_users.html
@@ -0,0 +1,40 @@
+{# User account preferences. #}
+
+{% load i18n %}
+
+{% block content %}
+
+{% if auth_backends.0.supports_change_name %}
+<tr>
+ <td><label for="id_first_name">{% trans "First Name:" %}</label></td>
+ <td>{{form.first_name}}</td>
+</tr>
+<tr>
+ <td><label for="id_last_name">{% trans "Last Name:" %}</label></td>
+ <td>{{form.last_name}}</td>
+</tr>
+{% endif %}
+{% if auth_backends.0.supports_change_email %}
+<tr>
+ <td><label for="id_email">{% trans "Email:" %}</label></td>
+ <td>{{form.email}} {{form.errors.email}}</td>
+</tr>
+{% endif %}
+{% if auth_backends.0.supports_change_password %}
+<tr>
+ <td><label for="id_password">{% trans "Change Password:" %}</label></td>
+ <td>{{form.password1}}</td>
+</tr>
+<tr>
+ <td><label for="id_password2">{% trans "Verify New Password:" %}</label></td>
+ <td>{{form.password2}} {{form.errors.password2}}</td>
+</tr>
+{% endif %}
+{% if siteconfig.settings.diffviewer_syntax_highlighting %}
+<tr>
+ <td></td>
+ <td>{{form.syntax_highlighting}} {{form.syntax_highlighting.label}}</td>
+</tr>
+{% endif %}
+
+{% endblock %}
diff --git a/reviewboard/templates/accounts/register.html b/reviewboard/templates/accounts/register.html
index 42bd8835e240b00ed5463de735a1262a1a7a70dc..b7768add28e5e50250abb52080e8c3cca3e593b6 100644
--- a/reviewboard/templates/accounts/register.html
+++ b/reviewboard/templates/accounts/register.html
@@ -9,58 +9,7 @@
  <h1 class="title">{% trans "Register" %}</h1>
  <div class="main">
   <table id="login_form">
-   <tr>
-    <td class="label"><label for="id_username">{% trans "Username:" %}</label></td>
-    <td class="field">{{form.username}}</td>
-    <td class="errorbox">{{form.errors.username}}</td>
-   </tr>
-   <tr>
-    <td class="label"><label for="id_password1">{% trans "Password:" %}</label></td>
-    <td class="field">{{form.password1}}</td>
-    <td class="errorbox">{{form.errors.password1}}</td>
-   </tr>
-   <tr>
-    <td class="label"><label for="id_password2">{% trans "Password (repeat):" %}</label></td>
-    <td class="field">{{form.password2}}</td>
-    <td class="errorbox">{{form.errors.password2}}</td>
-   </tr>
-   <tr>
-    <td class="label"><label for="id_email">{% trans "E-mail address:" %}</label></td>
-    <td class="field">{{form.email}}</td>
-    <td class="errorbox">{{form.errors.email}}</td>
-   </tr>
-   <tr>
-    <td class="label"><label for="id_first_name">{% trans "First name:" %}</label></td>
-    <td class="field">{{form.first_name}}</td>
-    <td class="errorbox">{{form.errors.first_name}}</td>
-   </tr>
-   <tr>
-    <td class="label"><label for="id_last_name">{% trans "Last name:" %}</label></td>
-    <td class="field">{{form.last_name}}</td>
-    <td class="errorbox">{{form.errors.last_name}}</td>
-   </tr>
-{% if siteconfig.settings.auth_registration_show_captcha %}
-   <tr>
-    <td></td>
-	<td colspan="2">
-	 <script type="text/javascript" src="{{form.recaptcha_url}}/challenge?k={{siteconfig.settings.recaptcha_public_key}}{{form.captcha_error_query_str}}">
-	 </script>
-
-	 <noscript>
-	  <iframe src="{{form.recaptcha_url}}/noscript?k={{siteconfig.settings.recaptcha_public_key}}{{form.captcha_error_query_str}}"
-	          height="300" width="500" frameborder="0"></iframe>
-      <br />
-	  <textarea name="recaptcha_challenge_field" rows="3" cols="40">
-	  </textarea>
-	  <input type="hidden" name="recaptcha_response_field" value="manual_challenge" />
-	 </noscript>
-	</td>
-   </tr>
-{% endif %}
-   <tr>
-    <td><input type="submit" value="{% trans "Register" %}" /></td>
-    <td>&nbsp;</td>
-   </tr>
+{% include "accounts/register/register_form.html" %}
   </table>
  </div>
 </form>
diff --git a/reviewboard/templates/accounts/register/register_form.html b/reviewboard/templates/accounts/register/register_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..f90b1a5e7d006de1c64fe712f17349775d467528
--- /dev/null
+++ b/reviewboard/templates/accounts/register/register_form.html
@@ -0,0 +1,61 @@
+{# Register content. #}
+
+{% load djblets_deco %}
+{% load i18n %}
+
+{% block content %}
+
+<tr>
+ <td class="label"><label for="id_username">{% trans "Username:" %}</label></td>
+ <td class="field">{{form.username}}</td>
+ <td class="errorbox">{{form.errors.username}}</td>
+</tr>
+<tr>
+ <td class="label"><label for="id_password1">{% trans "Password:" %}</label></td>
+ <td class="field">{{form.password1}}</td>
+ <td class="errorbox">{{form.errors.password1}}</td>
+</tr>
+<tr>
+ <td class="label"><label for="id_password2">{% trans "Password (repeat):" %}</label></td>
+ <td class="field">{{form.password2}}</td>
+ <td class="errorbox">{{form.errors.password2}}</td>
+</tr>
+<tr>
+ <td class="label"><label for="id_email">{% trans "E-mail address:" %}</label></td>
+ <td class="field">{{form.email}}</td>
+ <td class="errorbox">{{form.errors.email}}</td>
+</tr>
+<tr>
+ <td class="label"><label for="id_first_name">{% trans "First name:" %}</label></td>
+ <td class="field">{{form.first_name}}</td>
+ <td class="errorbox">{{form.errors.first_name}}</td>
+</tr>
+<tr>
+ <td class="label"><label for="id_last_name">{% trans "Last name:" %}</label></td>
+ <td class="field">{{form.last_name}}</td>
+ <td class="errorbox">{{form.errors.last_name}}</td>
+</tr>
+{% if siteconfig.settings.auth_registration_show_captcha %}
+<tr>
+ <td></td>
+ <td colspan="2">
+  <script type="text/javascript" src="{{form.recaptcha_url}}/challenge?k={{siteconfig.settings.recaptcha_public_key}}{{form.captcha_error_query_str}}">
+  </script>
+
+  <noscript>
+   <iframe src="{{form.recaptcha_url}}/noscript?k={{siteconfig.settings.recaptcha_public_key}}{{form.captcha_error_query_str}}"
+	          height="300" width="500" frameborder="0"></iframe>
+   <br />
+   <textarea name="recaptcha_challenge_field" rows="3" cols="40">
+   </textarea>
+   <input type="hidden" name="recaptcha_response_field" value="manual_challenge" />
+  </noscript>
+ </td>
+</tr>
+{% endif %}
+<tr>
+ <td><input type="submit" value="{% trans "Register" %}" /></td>
+ <td>&nbsp;</td>
+</tr>
+
+{% endblock %}
diff --git a/reviewboard/templates/accounts/user_infobox.html b/reviewboard/templates/accounts/user_infobox.html
index 8a8c1c7b6c350d9976f0e41633c316b2ab34d52d..7c8f7b6160cdd973bedd122c8c9723eff05cc086 100644
--- a/reviewboard/templates/accounts/user_infobox.html
+++ b/reviewboard/templates/accounts/user_infobox.html
@@ -9,10 +9,6 @@
   {% gravatar user 85 %}
  </div>
  <div class="infobox-text">
-  <h2 class="nickname">{{user}}</h2>
-  <p class="fn">{{user.first_name}} {{user.last_name}}</p>
-  <p class="email">{{user.email}}</p>
-  <p class="logged-in">Last logged in {{user.last_login|date:"F jS, Y"}}</p>
-  <p class="joined">Joined {{user.date_joined|date:"F jS, Y"}}</p>
+{% include "accounts/user_infobox_user_infobox_content.html" %}
  </div>
 </div>
diff --git a/reviewboard/templates/accounts/user_infobox/user_infobox_content.html b/reviewboard/templates/accounts/user_infobox/user_infobox_content.html
new file mode 100644
index 0000000000000000000000000000000000000000..369ef72525f2ea34f7714ddaa8e564f6ac99db68
--- /dev/null
+++ b/reviewboard/templates/accounts/user_infobox/user_infobox_content.html
@@ -0,0 +1,17 @@
+{# User info content. #}
+
+{% load i18n %}
+{% load djblets_deco %}
+{% load djblets_utils %}
+{% load gravatars %}
+{% load reviewtags %}
+
+{% block content %}
+
+<h2 class="nickname">{{user}}</h2>
+<p class="fn">{{user.first_name}} {{user.last_name}}</p>
+<p class="email">{{user.email}}</p>
+<p class="logged-in">Last logged in {{user.last_login|date:"F jS, Y"}}</p>
+<p class="joined">Joined {{user.date_joined|date:"F jS, Y"}}</p>
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/base_site.html b/reviewboard/templates/admin/base_site.html
index 25b5d46bf1b432e892a353ba62cd912bf5e95c11..1cdbe1e535d257b5bec0cf19943802ed78f9bf8f 100644
--- a/reviewboard/templates/admin/base_site.html
+++ b/reviewboard/templates/admin/base_site.html
@@ -9,8 +9,7 @@
 {% endblock %}
 
 {% block branding %}
-<a href="{% url root %}"><img id="logo" src="{{MEDIA_URL}}rb/images/logo.png?{{MEDIA_SERIAL}}" width="60" height="57" alt="" border="0" /></a>
-<h1 id="site-name">{% trans "Review Board administration" %}</h1>
+{% include "admin/base_site/banner.html" %}
 {% endblock %}
 
 {% block breadcrumbs %}
@@ -20,9 +19,7 @@
 {% block nav-global %}
 {%  if user.is_authenticated %}
 <ul id="admin-nav">
- <li><a href="{% url reviewboard.admin.views.dashboard %}">{% trans "Dashboard" %}</a></li>
- <li><a href="{% url reviewboard.admin.views.dashboard %}db/">{% trans "Database" %}</a></li>
- <li><a href="{% url site-settings %}">{% trans "Settings" %}</a></li>
+{% include "admin/base_site/nav_list.html" %}
 </ul>
 
 {%   block subnavbar %}{% endblock %}
diff --git a/reviewboard/templates/admin/base_site/banner.html b/reviewboard/templates/admin/base_site/banner.html
new file mode 100644
index 0000000000000000000000000000000000000000..78ce6af78c32822ec7b3257496331d6e45864a83
--- /dev/null
+++ b/reviewboard/templates/admin/base_site/banner.html
@@ -0,0 +1,10 @@
+{# Admin banner image and header. #}
+
+{% load i18n %}
+
+{% block content %}
+
+<a href="{% url root %}"><img id="logo" src="{{MEDIA_URL}}rb/images/logo.png?{{MEDIA_SERIAL}}" width="60" height="57" alt="" border="0" /></a>
+<h1 id="site-name">{% trans "Review Board administration" %}</h1>
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/base_site/nav_list.html b/reviewboard/templates/admin/base_site/nav_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..976d2bf84fc05d287e5d999e5b90978bdbe42213
--- /dev/null
+++ b/reviewboard/templates/admin/base_site/nav_list.html
@@ -0,0 +1,9 @@
+{# Navigation menu of admin_base.html (menu beneath the banner). #}
+
+{% load i18n %}
+
+{% block content %}
+<li><a href="{% url reviewboard.admin.views.dashboard %}">{% trans "Dashboard" %}</a></li>
+<li><a href="{% url reviewboard.admin.views.dashboard %}db/">{% trans "Database" %}</a></li>
+<li><a href="{% url site-settings %}">{% trans "Settings" %}</a></li>
+{% endblock %}
diff --git a/reviewboard/templates/admin/dashboard.html b/reviewboard/templates/admin/dashboard.html
index 3cebe34fbf727bb61597e4cd43c78adabb4782b9..73f1d516012a98686bd849c05f59809800606de4 100644
--- a/reviewboard/templates/admin/dashboard.html
+++ b/reviewboard/templates/admin/dashboard.html
@@ -14,31 +14,12 @@
 {% block content %}
 <div class="colMS">
  <div id="content-main">
-  {# "Manage" section #}
+   {# "Manage" section #}
   <div class="module manage">
    <table summary="{% trans "Common management operations." %}">
     <caption>{% trans "Manage" %}</caption>
     <tbody>
-     <tr>
-      <th scope="row"><a href="db/auth/user/">{% trans "Users" %}</a>
-        <span class="count">({{user_count}})</span></th>
-      <td><a class="addlink" href="db/auth/user/add/">{% trans "Add" %}</a></td>
-     </tr>
-     <tr>
-      <th scope="row"><a href="db/reviews/group/">{% trans "Review groups" %}</a>
-        <span class="count">({{reviewgroup_count}})</span></th>
-      <td><a class="addlink" href="db/reviews/group/add/">{% trans "Add" %}</a></td>
-     </tr>
-     <tr>
-      <th scope="row"><a href="db/reviews/defaultreviewer/">{% trans "Default reviewers" %}</a>
-        <span class="count">({{defaultreviewer_count}})</span></th>
-      <td><a class="addlink" href="db/reviews/defaultreviewer/add/">{% trans "Add" %}</a></td>
-     </tr>
-     <tr>
-      <th scope="row"><a href="db/scmtools/repository/">{% trans "Repositories" %}</a>
-        <span class="count">({{repository_count}})</span></th>
-      <td><a class="addlink" href="db/scmtools/repository/add/">{% trans "Add" %}</a></td>
-     </tr>
+{% include "admin/dashboard/dashboard_manage.html" %}
     </tbody>
    </table>
   </div>
@@ -50,18 +31,7 @@
    <table summary="{% trans "Server information." %}">
     <caption>{% trans "Server Information" %}</caption>
     <tbody>
-     <tr>
-      <th>{% trans "Review Board version" %}</th>
-      <td>{{version}}</td>
-     </tr>
-     <tr>
-      <th colspan="2"><a href="cache/">{% trans "Server Cache" %}</a></th>
-     </tr>
-{% if settings.LOGGING_ENABLED and settings.LOGGING_DIRECTORY %}
-     <tr>
-      <th colspan="2"><a href="{% url server-log %}">{% trans "Server Log" %}</a></th>
-     </tr>
-{% endif %}
+{% include "admin/dashboard/dashboard_server_info.html" %}
     </tbody>
    </table>
   </div>
@@ -73,26 +43,14 @@
  {# "News" section #}
  <div class="module news">
   <table summary="{% trans "Latest Review Board news updates." %}">
-   <caption>{% trans "News" %}
-	<span class="actions">
-     <a href="http://www.reviewboard.org/news/">View All News</a>
-	 |
-     <a href="." id="reload-news">{% trans "Reload" %}</a>
-     |
-     <a href="feed/news/rss/">
-      <img src="{{MEDIA_URL}}rb/images/rss.png?{{MEDIA_SERIAL}}" width="14" height="14" />
-      RSS
-     </a>
+   <caption>
+    <span class="title">{% trans "News" %}</span>
+    <span class="actions">
+{% include "admin/dashboard/dashboard_news_links.html" %}
     </span>
    </caption>
    <tbody>
-    <tr>
-     <td id="news-content">
-	  <img src="{{MEDIA_URL}}rb/images/spinner.gif?{{MEDIA_SERIAL}}"
-	       class="loading-indicator" width="16" height="16" border="0" alt="" />
-	  {% trans "Loading..." %}
-	 </td>
-    </tr>
+{% include "admin/dashboard/dashboard_news.html" %}
    </tbody>
   </table>
  </div>
diff --git a/reviewboard/templates/admin/dashboard/dashboard_manage.html b/reviewboard/templates/admin/dashboard/dashboard_manage.html
new file mode 100644
index 0000000000000000000000000000000000000000..ded6446241f11f09f04d2170092473e931a5e2f4
--- /dev/null
+++ b/reviewboard/templates/admin/dashboard/dashboard_manage.html
@@ -0,0 +1,42 @@
+{# The dashboard manager in the admin view. #}
+
+{% load i18n %}
+
+{% block content %}
+
+<tr>
+ <th scope="row"><a href="db/auth/user/">{% trans "Users" %}</a>
+   <span class="count">({{user_count}})</span>
+ </th>
+ <td>
+  <a class="addlink" href="db/auth/user/add/">{% trans "Add" %}</a>
+ </td>
+</tr>
+<tr>
+ <th scope="row"><a href="db/reviews/group/">{% trans "Review groups" %}</a>
+   <span class="count">({{reviewgroup_count}})</span>
+ </th>
+ <td>
+  <a class="addlink" href="db/reviews/group/add/">{% trans "Add" %}</a>
+ </td>
+</tr>
+<tr>
+ <th scope="row">
+  <a href="db/reviews/defaultreviewer/">{% trans "Default reviewers" %}</a>
+  <span class="count">({{defaultreviewer_count}})</span>
+ </th>
+ <td>
+  <a class="addlink" href="db/reviews/defaultreviewer/add/">{% trans "Add" %}</a>
+ </td>
+</tr>
+<tr>
+ <th scope="row">
+  <a href="db/scmtools/repository/">{% trans "Repositories" %}</a>
+  <span class="count">({{repository_count}})</span>
+ </th>
+ <td>
+  <a class="addlink" href="db/scmtools/repository/add/">{% trans "Add" %}</a>
+ </td>
+</tr>
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/dashboard/dashboard_manage_extended.html b/reviewboard/templates/admin/dashboard/dashboard_manage_extended.html
new file mode 100644
index 0000000000000000000000000000000000000000..3bbee48b6990f2447317032316a52a07068107e6
--- /dev/null
+++ b/reviewboard/templates/admin/dashboard/dashboard_manage_extended.html
@@ -0,0 +1 @@
+{% extends "reviewboard/admin/dashboard/dashboard_manage.html" %}
diff --git a/reviewboard/templates/admin/dashboard/dashboard_news.html b/reviewboard/templates/admin/dashboard/dashboard_news.html
new file mode 100644
index 0000000000000000000000000000000000000000..7aab2722c0579b030e3f5800d93d07a85a525839
--- /dev/null
+++ b/reviewboard/templates/admin/dashboard/dashboard_news.html
@@ -0,0 +1,15 @@
+{# Dashboard news component. #}
+
+{% load i18n %}
+
+{% block content %}
+
+<tr>
+ <td id="news-content">
+  <img src="{{MEDIA_URL}}rb/images/spinner.gif?{{MEDIA_SERIAL}}"
+    class="loading-indicator" width="16" height="16" border="0" alt="" />
+  {% trans "Loading..." %}
+ </td>
+</tr>
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/dashboard/dashboard_news_links.html b/reviewboard/templates/admin/dashboard/dashboard_news_links.html
new file mode 100644
index 0000000000000000000000000000000000000000..441494ed4723328a628d387dd29a8fad79a571aa
--- /dev/null
+++ b/reviewboard/templates/admin/dashboard/dashboard_news_links.html
@@ -0,0 +1,15 @@
+{# Dashboard news links. #}
+
+{% load i18n %}
+
+{% block content %}
+
+<a href="http://www.reviewboard.org/news/">View All News</a>
+|
+<a href="." id="reload-news">{% trans "Reload" %}</a>
+|
+<a href="feed/news/rss/">
+<img src="{{MEDIA_URL}}rb/images/rss.png?{{MEDIA_SERIAL}}" width="14" height="14" />
+   RSS   </a>
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/dashboard/dashboard_server_info.html b/reviewboard/templates/admin/dashboard/dashboard_server_info.html
new file mode 100644
index 0000000000000000000000000000000000000000..c0a36dbec83ff428e9392b2c40bc7d29063812ec
--- /dev/null
+++ b/reviewboard/templates/admin/dashboard/dashboard_server_info.html
@@ -0,0 +1,20 @@
+{# Dashboard server section. #}
+
+{% load i18n %}
+
+{% block content %}
+
+<tr>
+ <th>{% trans "Review Board version" %}</th>
+ <td>{{version}}</td>
+</tr>
+<tr>
+ <th colspan="2"><a href="cache/">{% trans "Server Cache" %}</a></th>
+</tr>
+{% if settings.LOGGING_ENABLED and settings.LOGGING_DIRECTORY %}
+<tr>
+ <th colspan="2"><a href="{% url server-log %}">{% trans "Server Log" %}</a></th>
+</tr>
+{% endif %}
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/database.html b/reviewboard/templates/admin/database.html
index 66d9222d45a3aa94ebe3d169570682f2d0bd6733..18cfb1e89f7fb25a4089179e167972ed78a77a4f 100644
--- a/reviewboard/templates/admin/database.html
+++ b/reviewboard/templates/admin/database.html
@@ -48,18 +48,7 @@
 {% block sidebar %}
 <div id="content-related">
  <div class="module" id="recent-actions-module">
-  <h2>{% trans "Recent Actions" %}</h2>
-  <h3>{% trans "My Actions" %}</h3>
-{% get_admin_log 10 as admin_log for_user user %}
-{% if not admin_log %}
-  <p>{% trans "None available" %}</p>
-{% else %}
-  <ul class="actionlist">
-{%  for entry in admin_log %}
-   <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">{% if not entry.is_deletion %}<a href="{{ entry.get_admin_url }}">{% endif %}{{ entry.object_repr|escape }}{% if not entry.is_deletion %}</a>{% endif %}<br /><span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span></li>
-{%  endfor %}
-  </ul>
-{% endif %}
+{% include "admin/database/database_sidebar.html" %}
  </div>
 </div>
 {% endblock %}
diff --git a/reviewboard/templates/admin/database/database_sidebar.html b/reviewboard/templates/admin/database/database_sidebar.html
new file mode 100644
index 0000000000000000000000000000000000000000..ebd0ed2330b7a2a6ed79f32853c5520df535683b
--- /dev/null
+++ b/reviewboard/templates/admin/database/database_sidebar.html
@@ -0,0 +1,21 @@
+{# The Database sidebar links. #}
+
+{% include i18n %}
+
+{% block content %}
+
+<h2>{% trans "Recent Actions" %}</h2>
+<h3>{% trans "My Actions" %}</h3>
+
+{% get_admin_log 10 as admin_log for_user user %}
+{% if not admin_log %}
+<p>{% trans "None available" %}</p>
+{% else %}
+<ul class="actionlist">
+{%  for entry in admin_log %}
+ <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">{% if not entry.is_deletion %}<a href="{{ entry.get_admin_url }}">{% endif %}{{ entry.object_repr|escape }}{% if not entry.is_deletion %}</a>{% endif %}<br /><span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span></li>
+{%  endfor %}
+</ul>
+{% endif %}
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/feed.html b/reviewboard/templates/admin/feed.html
index d197a8fad8b9788bfb5193db66812ec2a9175cee..4718f0c23dedd26b4ecb2822debb5e693ecaae6b 100644
--- a/reviewboard/templates/admin/feed.html
+++ b/reviewboard/templates/admin/feed.html
@@ -1,5 +1,8 @@
 {% load feedtags %}
 {% load i18n %}
+
+{% block content %}
+
 {% if error %}
 {%  blocktrans with error.reason as error %}<p class="feed-error">Unable to load feed: {{error}}</p>{% endblocktrans %}
 {% else %}
@@ -12,3 +15,5 @@
 </div>
 {%  endfor %}
 {% endif %}
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/index.html b/reviewboard/templates/admin/index.html
index 68c223423cc19fcba541a20e21fd82aa75867972..299c1bb23e8c9a3acd7a012b389175ae0847d34c 100644
--- a/reviewboard/templates/admin/index.html
+++ b/reviewboard/templates/admin/index.html
@@ -48,18 +48,7 @@
 {% block sidebar %}
 <div id="content-related">
  <div class="module" id="recent-actions-module">
-  <h2>{% trans "Recent Actions" %}</h2>
-  <h3>{% trans "My Actions" %}</h3>
-{% get_admin_log 10 as admin_log for_user user %}
-{% if not admin_log %}
-  <p>{% trans "None available" %}</p>
-{% else %}
-  <ul class="actionlist">
-{%  for entry in admin_log %}
-   <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">{% if not entry.is_deletion %}<a href="{{ entry.get_admin_url }}">{% endif %}{{ entry.object_repr|escape }}{% if not entry.is_deletion %}</a>{% endif %}<br /><span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span></li>
-{%  endfor %}
-  </ul>
-{% endif %}
+{% include "admin/index/index_sidebar.html" %}
  </div>
 </div>
 {% endblock %}
diff --git a/reviewboard/templates/admin/index/index_sidebar.html b/reviewboard/templates/admin/index/index_sidebar.html
new file mode 100644
index 0000000000000000000000000000000000000000..19f4d38ecd056ad4daa6d0a3ca0a51988896d996
--- /dev/null
+++ b/reviewboard/templates/admin/index/index_sidebar.html
@@ -0,0 +1,23 @@
+{# The sidebar for the database link (actually called index). #}
+
+{% load adminmedia %}
+{% load i18n %}
+{% load log %}
+
+{% block content %}
+
+<h2>{% trans "Recent Actions" %}</h2>
+<h3>{% trans "My Actions" %}</h3>
+
+{% get_admin_log 10 as admin_log for_user user %}
+{% if not admin_log %}
+<p>{% trans "None available" %}</p>
+{% else %}
+<ul class="actionlist">
+{%  for entry in admin_log %}
+ <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">{% if not entry.is_deletion %}<a href="{{ entry.get_admin_url }}">{% endif %}{{ entry.object_repr|escape }}{% if not entry.is_deletion %}</a>{% endif %}<br /><span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span></li>
+{%  endfor %}
+</ul>
+{% endif %}
+
+{% endblock %}
diff --git a/reviewboard/templates/admin/subnav_item.html b/reviewboard/templates/admin/subnav_item.html
index a647509f97fb91e729dc116ff40557ecc523542d..9aced71d9b8a3a9c66cba1d179c85ea7cd8cb665 100644
--- a/reviewboard/templates/admin/subnav_item.html
+++ b/reviewboard/templates/admin/subnav_item.html
@@ -1 +1,5 @@
+{# Sub navigation tab. #}
+
+{% block content %}
 <li><a href="{{url}}" {% if current %}class="active"{% endif %}>{{name}}</a></li>
+{% endblock %}
diff --git a/reviewboard/templates/base.html b/reviewboard/templates/base.html
index 370451a4e53bd489db244759fd7bd0fb91f1d6e2..eef3bac4f92f7dcec454c931ca67c1ead02aa858 100644
--- a/reviewboard/templates/base.html
+++ b/reviewboard/templates/base.html
@@ -49,64 +49,8 @@
  <body>
 {% endblock %}
   <div id="container">
-{% block headerbar %}
-   <div id="headerbar">
-    <ul id="accountnav">
-{% if user.is_authenticated %}
-{%  blocktrans with user|realname|escape as username %}
-     <li>Welcome, <b>{{username}}</b></li>
-{% endblocktrans %}
-     <li>- <a href="{% url user-preferences %}">{% trans "My account" %}</a></li>
-{%  if user.is_staff %}
-     <li>- <a href="{% url reviewboard.admin.views.dashboard %}">{% trans "Admin" %}</a></li>
-{%  endif %}
-     <li>- <a href="{% url logout %}">{% trans "Log out" %}</a></li>
-{% else %}
-     <li><a href="{% url login %}?next_page={{request.path}}">{% trans "Log in" %}</a></li>
-{#  XXX Using default sucks, but siteconfig defaults don't #}
-{#      work from templates.                               #}
-{%  if auth_backends.0.supports_registration and siteconfig.settings.auth_enable_registration|default_if_none:1 %}
-     <li>- <a href="{% url register %}">{% trans "Register" %}</a></li>
-{%  endif %}
-{% endif %}{# !is_authenticated #}
-     <li>- <a href="http://www.reviewboard.org/docs/manual/dev/">{% trans "Documentation" %}</a></li>
-     <li>- <a href="http://www.reviewboard.org/bugs/">{% trans "Bugs" %}</a></li>
-     <li>- <a href="http://www.reviewboard.org/bugs/new/">{% trans "Report bug" %}</a></li>
-    </ul>
-    <br />
-    <div id="rbinfo">
-     <a href="{% url root %}"><img id="logo" src="{{MEDIA_URL}}rb/images/logo.png?{{MEDIA_SERIAL}}" width="60" height="57" alt="" border="0" /></a>
-     <h1 id="title">
-	  <a href="{% url root %}">Review Board</a>
-	  <span class="version">{{version}}</span>
-	 </h1>
-    </div>
-   </div>
-   <div id="page-container">
-   {% if user.is_authenticated or not siteconfig.settings.auth_require_sitewide_login %}
-    {% if siteconfig.settings.search_enable %}<form method="get" action="{% url search %}">{% endif %}
-     <div id="navbar-outer">
-      <ul id="navbar">
-{% if user.is_authenticated %}
-       <li><a href="{% url dashboard %}">{% trans "My Dashboard" %}</a></li>
-       <li><a href="{% url new-review-request %}">{% trans "New Review Request" %}</a></li>
-       <li>-</li>
-{% endif %}
-       <li><a href="{% url all-review-requests %}">{% trans "All review requests" %}</a></li>
-       <li><a href="{% url all-groups %}">{% trans "Groups" %}</a></li>
-       <li><a href="{% url all-users %}">{% trans "Submitters" %}</a></li>
-       {% if siteconfig.settings.search_enable %}
-       <li id="searchbar">
-       <input type="text" name="q" {% attr "value" %}{{query}}{% endattr %} />
-        <input type="submit" value="{% trans "Search" %}" />
-       </li>
-       {% endif %}
-      </ul>
-     </div>
-     {% if siteconfig.settings.search_enable %}</form>{% endif %}
-    {% endif %}
-{% endblock %}
-    <noscript>
+{% include "base/base_header.html" %}
+     <noscript>
 {%  box "important" %}
      <h1>{% trans "JavaScript is turned off" %}</h1>
      <p>{% blocktrans %}Review Board requires JavaScript in order to function.
diff --git a/reviewboard/templates/base/base_banner.html b/reviewboard/templates/base/base_banner.html
new file mode 100644
index 0000000000000000000000000000000000000000..37371363befb7b6208dc5fa9cea0f7b27cc876d6
--- /dev/null
+++ b/reviewboard/templates/base/base_banner.html
@@ -0,0 +1,18 @@
+{# Base site's banner. #}
+
+{% load i18n %}
+
+{% block bannerImage %}
+
+<a href="{% url root %}"><img id="logo" src="{{MEDIA_URL}}rb/images/logo.png?{{MEDIA_SERIAL}}" width="60" height="57" alt="" border="0" /></a>
+
+{% endblock %}
+
+{% block bannerTitle %}
+
+<h1 id="title">
+ <a href="{% url root %}">Review Board</a>
+ <span class="version">{{version}}</span>
+</h1>
+
+{% endblock %}
diff --git a/reviewboard/templates/base/base_header.html b/reviewboard/templates/base/base_header.html
new file mode 100644
index 0000000000000000000000000000000000000000..a2ee926073ac17eb902366b9523b0038783560b1
--- /dev/null
+++ b/reviewboard/templates/base/base_header.html
@@ -0,0 +1,40 @@
+{% load djblets_deco %}
+{% load djblets_utils %}
+{% load i18n %}
+
+{% block content %}
+
+<div id="headerbar">
+ <ul id="accountnav">
+{% include "base/base_header_links.html" %}
+ </ul>
+ <br />
+ <div id="rbinfo">
+{% include "base/base_banner.html" %}
+ </div>
+</div>
+<div id="page-container">
+{% if user.is_authenticated or not siteconfig.settings.auth_require_sitewide_login %}
+ {% if siteconfig.settings.search_enable %}<form method="get" action="{% url search %}">{% endif %}
+ <div id="navbar-outer">
+  <ul id="navbar">
+ {% if user.is_authenticated %}
+   <li><a href="{% url dashboard %}">{% trans "My Dashboard" %}</a></li>
+   <li><a href="{% url new-review-request %}">{% trans "New Review Request" %}</a></li>
+   <li>-</li>
+ {% endif %}
+   <li><a href="{% url all-review-requests %}">{% trans "All review requests" %}</a></li>
+   <li><a href="{% url all-groups %}">{% trans "Groups" %}</a></li>
+   <li><a href="{% url all-users %}">{% trans "Submitters" %}</a></li>
+ {% if siteconfig.settings.search_enable %}
+   <li id="searchbar">
+   <input type="text" name="q" {% attr "value" %}{{query}}{% endattr %} />
+    <input type="submit" value="{% trans "Search" %}" />
+   </li>
+   {% endif %}
+  </ul>
+ </div>
+ {% if siteconfig.settings.search_enable %}</form>{% endif %}
+{% endif %}
+
+{% endblock %}
diff --git a/reviewboard/templates/base/base_header_links.html b/reviewboard/templates/base/base_header_links.html
new file mode 100644
index 0000000000000000000000000000000000000000..76b6479f3fa7440843297323d2ec7eae07a10896
--- /dev/null
+++ b/reviewboard/templates/base/base_header_links.html
@@ -0,0 +1,28 @@
+{% load djblets_deco %}
+{% load djblets_utils %}
+{% load i18n %}
+
+{% block content %}
+
+{% if user.is_authenticated %}
+ {%  blocktrans with user|realname|escape as username %}
+  <li>Welcome, <b>{{username}}</b></li>
+ {% endblocktrans %}
+  <li>- <a href="{% url user-preferences %}">{% trans "My account" %}</a></li>
+ {%  if user.is_staff %}
+  <li>- <a href="{% url reviewboard.admin.views.dashboard %}">{% trans "Admin" %}</a></li>
+ {%  endif %}
+  <li>- <a href="{% url logout %}">{% trans "Log out" %}</a></li>
+ {% else %}
+  <li><a href="{% url login %}?next_page={{request.path}}">{% trans "Log in" %}</a></li>
+ {#  XXX Using default sucks, but siteconfig defaults don't #}
+ {#      work from templates.                               #}
+ {%  if auth_backends.0.supports_registration and siteconfig.settings.auth_enable_registration|default_if_none:1 %}
+  <li>- <a href="{% url register %}">{% trans "Register" %}</a></li>
+ {%  endif %}
+ {% endif %}{# !is_authenticated #}
+  <li>- <a href="http://www.reviewboard.org/docs/manual/dev/">{% trans "Documentation" %}</a></li>
+  <li>- <a href="http://www.reviewboard.org/bugs/">{% trans "Bugs" %}</a></li>
+  <li>- <a href="http://www.reviewboard.org/bugs/new/">{% trans "Report bug" %}</a></li>
+
+{% endblock %}
diff --git a/reviewboard/templates/diffviewer/changeindex.html b/reviewboard/templates/diffviewer/changeindex.html
index 543244289436b162434df9cbaf219dabac9156cd..8b51dbd011b2d1c71981b08fb21647e5beb36173 100644
--- a/reviewboard/templates/diffviewer/changeindex.html
+++ b/reviewboard/templates/diffviewer/changeindex.html
@@ -1,4 +1,7 @@
 {% load i18n %}
+
+{% block content %}
+
 <ol class="index" start="{{page_start_index}}">
 {% for file in files %}
  <li class="change_file_{{file.index}}"><a href="#{{file.index}}" onclick="return !gotoAnchor('{{file.index}}');">{{file.dest_filename}}</a>:
@@ -19,3 +22,5 @@
  {% endfor %}
  {% if has_next %}<span class="paginate-next"><a href="?page={{ next_page }}" title="{% trans "Next Page" %}">&gt;</a></span>{% endif %}
 {% endif %}
+
+{% endblock %}
diff --git a/reviewboard/templates/diffviewer/changeindex_entry.html b/reviewboard/templates/diffviewer/changeindex_entry.html
index 4cae1a6d891a46faa097ad78f577224ffe672e98..e9f7bfdc7e692396faad3c3c72ec2b242066bef9 100644
--- a/reviewboard/templates/diffviewer/changeindex_entry.html
+++ b/reviewboard/templates/diffviewer/changeindex_entry.html
@@ -1,4 +1,7 @@
 {% load i18n %}
+
+{% block content %}
+
 <a href="#{{file.index}}" onclick="return !gotoAnchor('{{file.index}}');">{{file.dest_filename}}</a>
 {% if file.dest_filename != file.depot_filename %}
  (was {{file.depot_filename}})
@@ -29,3 +32,5 @@
 {%   endif %}{# !deleted #}
 {%  endif %}{# !binary #}
 {% endif %}{# !error #}
+
+{% endblock %}
diff --git a/reviewboard/templates/diffviewer/diff_file_fragment.html b/reviewboard/templates/diffviewer/diff_file_fragment.html
index b2be6e7eb27f80d4b1fcb13ff9ffa523d21ec555..6b0ad08e03082c0c0ccad539c7ba811ac76ce687 100644
--- a/reviewboard/templates/diffviewer/diff_file_fragment.html
+++ b/reviewboard/templates/diffviewer/diff_file_fragment.html
@@ -2,6 +2,9 @@
 {% load difftags %}
 {% load djblets_deco %}
 {% load djblets_utils %}
+
+{% block content %}
+
 {% if standalone and error %}
 {{error}}
 {% endif %}
@@ -122,3 +125,5 @@
 </script>
 {%  endif %}{# not standalone #}
 {% endif %}{# No changed chunks and not a binary file #}
+
+{% endblock %}
diff --git a/reviewboard/templates/diffviewer/diff_fragment_error.html b/reviewboard/templates/diffviewer/diff_fragment_error.html
index 35e201caa3522d9cea08e11573e0f66150dc6e9c..3802a76587b8f408c7f6fe3b10ced1a706912a41 100644
--- a/reviewboard/templates/diffviewer/diff_fragment_error.html
+++ b/reviewboard/templates/diffviewer/diff_fragment_error.html
@@ -1,6 +1,8 @@
 {% load djblets_utils %}
 {% load i18n %}
 
+{% block content %}
+
 <table class="sidebyside diff-error{% if file.newfile %} newfile{% endif %}"
        id="file_container_{{file.filediff.id}}">
  <thead>
@@ -61,3 +63,5 @@
     {% include_as_string "diffviewer/changeindex_entry.html" %});
 </script>
 {% endif %}
+
+{% endblock %}
diff --git a/reviewboard/templates/reviews/dashboard_entry.html b/reviewboard/templates/reviews/dashboard_entry.html
index b606fcbd984ac8380d030ae79cab7a39b3c63652..62e581f5af1ed216072cfd15747a2792395cccb7 100644
--- a/reviewboard/templates/reviews/dashboard_entry.html
+++ b/reviewboard/templates/reviews/dashboard_entry.html
@@ -1,4 +1,8 @@
-    <tr onclick="javascript:window.location=&quot;{% url dashboard %}?view={{view}}{% if group_name %}&amp;group={{group_name}}{% endif %}&quot;; return false;"{% if selected %} class="selected"{% endif %}>
-     <td class="summary {{level}}"><a href="{% url dashboard %}?view={{view}}{% if group_name %}&amp;group={{group_name}}{% endif %}">{% if starred %}<img src="{{MEDIA_URL}}rb/images/star_on.png?{{MEDIA_SERIAL}}" width="16" height="15" alt="" />{% endif %} {{text}}</a></td>
-     <td>{% if show_count %}{{count}}{% endif %}</td>
-    </tr>
+{% block content %}
+
+<tr onclick="javascript:window.location=&quot;{% url dashboard %}?view={{view}}{% if group_name %}&amp;group={{group_name}}{% endif %}&quot;; return false;"{% if selected %} class="selected"{% endif %}>
+ <td class="summary {{level}}"><a href="{% url dashboard %}?view={{view}}{% if group_name %}&amp;group={{group_name}}{% endif %}">{% if starred %}<img src="{{MEDIA_URL}}rb/images/star_on.png?{{MEDIA_SERIAL}}" width="16" height="15" alt="" />{% endif %} {{text}}</a></td>
+ <td>{% if show_count %}{{count}}{% endif %}</td>
+</tr>
+
+{% endblock %}
diff --git a/reviewboard/templates/reviews/diff_comment_fragment.html b/reviewboard/templates/reviews/diff_comment_fragment.html
index 92dee60355194cd737ea32143377fd77377072b3..9105009aaf4f2fff18aa2504bad1a3b4f5dca24b 100644
--- a/reviewboard/templates/reviews/diff_comment_fragment.html
+++ b/reviewboard/templates/reviews/diff_comment_fragment.html
@@ -1,6 +1,9 @@
 {% load djblets_utils %}
 {% load reviewtags %}
 {% load difftags %}
+
+{% block content %}
+
 <table class="sidebyside{% ifequal comment.filediff.source_revision PRE_CREATION %} newfile{% endifequal %}">
  <colgroup>
   <col class="line" />
@@ -48,3 +51,5 @@
  </tbody>
 {% endfor %}{# chunks #}
 </table>
+
+{% endblock %}
diff --git a/reviewboard/templates/reviews/new_review/new_review_request_content.html b/reviewboard/templates/reviews/new_review/new_review_request_content.html
new file mode 100644
index 0000000000000000000000000000000000000000..0e449131570ab3c6fb0301951a731c23e8f7dc6f
--- /dev/null
+++ b/reviewboard/templates/reviews/new_review/new_review_request_content.html
@@ -0,0 +1,55 @@
+{# Content of the new review request template. #}
+
+{% load i18n %}
+
+{% block content %}
+
+<tr>
+ <td><label for="id_repository">{% trans "Repository" %}:</label></td>
+ <td>{{form.repository}}</td>
+ <td>{{form.repository.errors}}</td>
+</tr>
+<tr class="row_no_repository_explanation">
+ <td></td>
+ <td class="help" colspan="2">
+  {% blocktrans %}
+  You won't be able to add any diffs to this review request. The review
+  request will only be usable for reviewing screenshots and other graphic
+  files.
+  {% endblocktrans %}
+ </td>
+</tr>
+<tr class="row_changenum">
+ <td><label for="id_changenum">{{form.changenum.label}}:</label></td>
+ <td>{{form.changenum}}</td>
+ <td>{{form.changenum.errors}}</td>
+</tr>
+<tr class="row_basedir">
+ <td><label for="id_basedir">{{form.basedir.label}}:</label></td>
+ <td>{{form.basedir}}</td>
+ <td>{{form.basedir.errors}}</td>
+</tr>
+<tr class="row_basedir">
+ <td></td>
+ <td class="help" colspan="2">{{form.basedir.help_text}}</td>
+</tr>
+<tr class="row_diff_path">
+ <td><label for="id_diff_path">{{form.diff_path.label}}:</label></td>
+ <td>{{form.diff_path}}</td>
+ <td>{{form.diff_path.errors}}</td>
+</tr>
+<tr class="row_diff_path">
+ <td></td>
+ <td class="help" colspan="2">{{form.diff_path.help_text}}</td>
+</tr>
+<tr class="row_parent_diff_path">
+ <td><label for="id_parent_diff_path">{{form.parent_diff_path.label}}:</label></td>
+ <td>{{form.parent_diff_path}}</td>
+ <td>{{form.parent_diff_path.errors}}</td>
+</tr>
+<tr class="row_parent_diff_path">
+ <td></td>
+ <td class="help" colspan="2">{{form.parent_diff_path.help_text}}</td>
+</tr>
+
+{% endblock %}
diff --git a/reviewboard/templates/reviews/new_review/new_review_request_tips.html b/reviewboard/templates/reviews/new_review/new_review_request_tips.html
new file mode 100644
index 0000000000000000000000000000000000000000..02e4923fc723eb4d656dff95964ae000910b81a9
--- /dev/null
+++ b/reviewboard/templates/reviews/new_review/new_review_request_tips.html
@@ -0,0 +1,22 @@
+{# Tip content of a new review request. #}
+
+{% load i18n %}
+
+{% block content %}
+
+<h1>{% trans "Tip: Use post-review" %}</h1>
+<p>
+{% blocktrans %}
+ You can simplify creating and updating review requests by using
+ <a href="http://www.reviewboard.org/docs/manual/dev/users/tools/post-review/">post-review</a>.
+{% endblocktrans %}
+</p>
+<p>
+{% blocktrans %}
+ post-review is a command line tool that will help create compatible
+ diffs, create new review requests, and update them, effortlessly. It
+ is compatible with Windows, Linux, MacOS X, and Solaris.
+{% endblocktrans %}
+</p>
+
+{% endblock %}
diff --git a/reviewboard/templates/reviews/new_review_request.html b/reviewboard/templates/reviews/new_review_request.html
index e153d4b773037d54afd413cc57e18c0ae7e566ff..f16fe432b1424c6a91e9d12314e23866b6b6d61f 100644
--- a/reviewboard/templates/reviews/new_review_request.html
+++ b/reviewboard/templates/reviews/new_review_request.html
@@ -32,20 +32,7 @@
 
 {% block content %}
 {% box "tip" %}
-<h1>{% trans "Tip: Use post-review" %}</h1>
-<p>
-{% blocktrans %}
- You can simplify creating and updating review requests by using
- <a href="http://www.reviewboard.org/docs/manual/dev/users/tools/post-review/">post-review</a>.
-{% endblocktrans %}
-</p>
-<p>
-{% blocktrans %}
- post-review is a command line tool that will help create compatible
- diffs, create new review requests, and update them, effortlessly. It
- is compatible with Windows, Linux, MacOS X, and Solaris.
-{% endblocktrans %}
-</p>
+{% include "reviews/new_review/new_review_request_tips.html" %}
 {% endbox %}
 
 <form method="post" action="." enctype="multipart/form-data">
@@ -53,53 +40,7 @@
  <h1 class="title">{% trans "New Review Request" %}</h1>
  <div class="main">
   <table>
-   <tr>
-    <td><label for="id_repository">{% trans "Repository" %}:</label></td>
-	<td>{{form.repository}}</td>
-	<td>{{form.repository.errors}}</td>
-   </tr>
-   <tr class="row_no_repository_explanation">
-    <td></td>
-    <td class="help" colspan="2">
-     {% blocktrans %}
-     You won't be able to add any diffs to this review request. The review
-     request will only be usable for reviewing screenshots and other graphic
-     files.
-     {% endblocktrans %}
-    </td>
-   </tr>
-   <tr class="row_changenum">
-    <td><label for="id_changenum">{{form.changenum.label}}:</label></td>
-    <td>{{form.changenum}}</td>
-    <td>{{form.changenum.errors}}</td>
-   </tr>
-   <tr class="row_basedir">
-    <td><label for="id_basedir">{{form.basedir.label}}:</label></td>
-    <td>{{form.basedir}}</td>
-    <td>{{form.basedir.errors}}</td>
-   </tr>
-   <tr class="row_basedir">
-    <td></td>
-    <td class="help" colspan="2">{{form.basedir.help_text}}</td>
-   </tr>
-   <tr class="row_diff_path">
-    <td><label for="id_diff_path">{{form.diff_path.label}}:</label></td>
-    <td>{{form.diff_path}}</td>
-    <td>{{form.diff_path.errors}}</td>
-   </tr>
-   <tr class="row_diff_path">
-    <td></td>
-    <td class="help" colspan="2">{{form.diff_path.help_text}}</td>
-   </tr>
-   <tr class="row_parent_diff_path">
-    <td><label for="id_parent_diff_path">{{form.parent_diff_path.label}}:</label></td>
-    <td>{{form.parent_diff_path}}</td>
-    <td>{{form.parent_diff_path.errors}}</td>
-   </tr>
-   <tr class="row_parent_diff_path">
-    <td></td>
-    <td class="help" colspan="2">{{form.parent_diff_path.help_text}}</td>
-   </tr>
+{% include "reviews/new_review/new_review_request_content.html" %}
   </table>
  </div>
 {% endbox %}
@@ -109,4 +50,3 @@
 </form>
 
 {% endblock %}
-
diff --git a/reviewboard/templates/reviews/review_detail.html b/reviewboard/templates/reviews/review_detail.html
index 434d73e7c1640930b6dbffac6dbc91c29c13a49a..b82114eec3436c682ffdac8482e8cb12d838cf4a 100644
--- a/reviewboard/templates/reviews/review_detail.html
+++ b/reviewboard/templates/reviews/review_detail.html
@@ -8,7 +8,7 @@
 
 {% block jsconsts %}
 {{block.super}}
-{%  include "reviews/review_flags.js" %}
+{% include "reviews/review_flags.js" %}
 {% endblock %}
 
 {% block css %}
