diff --git a/ietf/community/urls.py b/ietf/community/urls.py
index 510d1a350..999512f76 100644
--- a/ietf/community/urls.py
+++ b/ietf/community/urls.py
@@ -1,7 +1,7 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
 
-urlpatterns = patterns('',
+urlpatterns = [
     url(r'^personal/(?P<username>[^/]+)/$', 'ietf.community.views.view_list'),
     url(r'^personal/(?P<username>[^/]+)/manage/$', 'ietf.community.views.manage_list'),
     url(r'^personal/(?P<username>[^/]+)/trackdocument/(?P<name>[^/]+)/$', 'ietf.community.views.track_document'),
@@ -9,5 +9,4 @@ urlpatterns = patterns('',
     url(r'^personal/(?P<username>[^/]+)/csv/$', 'ietf.community.views.export_to_csv'),
     url(r'^personal/(?P<username>[^/]+)/feed/$', 'ietf.community.views.feed'),
     url(r'^personal/(?P<username>[^/]+)/subscription/$', 'ietf.community.views.subscription'),
-
-)
+]
diff --git a/ietf/cookies/urls.py b/ietf/cookies/urls.py
index b8f146dcb..1e8c4518e 100644
--- a/ietf/cookies/urls.py
+++ b/ietf/cookies/urls.py
@@ -1,16 +1,16 @@
 # Copyright The IETF Trust 2010, All Rights Reserved
 
-from django.conf.urls import patterns
+from django.conf.urls import url
 from ietf.cookies import views
 
-urlpatterns = patterns('',
-     (r'^$', views.preferences),
-     (r'^new_enough/(?P<days>.+)$', views.new_enough),
-     (r'^new_enough/', views.new_enough),
-     (r'^expires_soon/(?P<days>.+)$', views.expires_soon),
-     (r'^expires_soon/', views.expires_soon),
-     (r'^full_draft/(?P<enabled>.+)$', views.full_draft),
-     (r'^full_draft/', views.full_draft),
-     (r'^left_menu/(?P<enabled>.+)$', views.left_menu),
-     (r'^left_menu/', views.left_menu),
-)
+urlpatterns = [
+    url(r'^$', views.preferences),
+    url(r'^new_enough/(?P<days>.+)$', views.new_enough),
+    url(r'^new_enough/', views.new_enough),
+    url(r'^expires_soon/(?P<days>.+)$', views.expires_soon),
+    url(r'^expires_soon/', views.expires_soon),
+    url(r'^full_draft/(?P<enabled>.+)$', views.full_draft),
+    url(r'^full_draft/', views.full_draft),
+    url(r'^left_menu/(?P<enabled>.+)$', views.left_menu),
+    url(r'^left_menu/', views.left_menu),
+]
diff --git a/ietf/dbtemplate/template.py b/ietf/dbtemplate/template.py
index f4276a9ef..dc29ff08b 100644
--- a/ietf/dbtemplate/template.py
+++ b/ietf/dbtemplate/template.py
@@ -4,8 +4,9 @@ from docutils.core import publish_string
 from docutils.utils import SystemMessage
 import debug                            # pyflakes:ignore
 
-from django.template.base import Template as DjangoTemplate, TemplateDoesNotExist, TemplateEncodingError
-from django.template.loader import BaseLoader
+from django.template import loaders
+from django.template.base import Template as DjangoTemplate, TemplateEncodingError
+from django.template.exceptions import TemplateDoesNotExist
 from django.utils.encoding import smart_unicode
 
 from ietf.dbtemplate.models import DBTemplate
@@ -60,9 +61,9 @@ class RSTTemplate(PlainTemplate):
             e.args = tuple(args)
             raise e
 
-class Loader(BaseLoader):
-    def __init__(self, *args, **kwargs):
-        super(Loader, self).__init__(self, *args, **kwargs)
+class Loader(loaders.base.Loader):
+    def __init__(self, engine):
+        super(Loader, self).__init__(engine)
         self.is_usable = True
 
     def load_template(self, template_name, template_dirs=None):
@@ -77,7 +78,7 @@ class Loader(BaseLoader):
             raise TemplateDoesNotExist(template_name)
 
 
-_loader = Loader()
+_loader = Loader(engine='django')
 
 
 def load_template_source(template_name, template_dirs=None):
diff --git a/ietf/dbtemplate/urls.py b/ietf/dbtemplate/urls.py
index d2d03977d..7a9a8bd51 100644
--- a/ietf/dbtemplate/urls.py
+++ b/ietf/dbtemplate/urls.py
@@ -1,7 +1,7 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
 
-urlpatterns = patterns('ietf.dbtemplate.views',
-    url(r'^(?P<acronym>[-a-z0-9]+)/$', 'template_list', name='template_list'),
-    url(r'^(?P<acronym>[-a-z0-9]+)/(?P<template_id>[\d]+)/$', 'template_edit', name='template_edit'),
-)
+urlpatterns = [
+    url(r'^(?P<acronym>[-a-z0-9]+)/$', 'ietf.dbtemplate.views.template_list', name='template_list'),
+    url(r'^(?P<acronym>[-a-z0-9]+)/(?P<template_id>[\d]+)/$', 'ietf.dbtemplate.views.template_edit', name='template_edit'),
+]
diff --git a/ietf/doc/urls.py b/ietf/doc/urls.py
index c8e7a503b..037d0d91b 100644
--- a/ietf/doc/urls.py
+++ b/ietf/doc/urls.py
@@ -30,7 +30,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from django.conf.urls import patterns, url, include
+from django.conf.urls import url, include
 from django.views.generic import RedirectView
 from django.conf import settings
 
@@ -42,13 +42,13 @@ session_patterns = [
     url(r'^(?P<session_id>\d+)/remove$', views_doc.remove_sessionpresentation),
 ]
 
-urlpatterns = patterns('',
-    (r'^/?$', views_search.search),
+urlpatterns = [ 
+    url(r'^/?$', views_search.search),
     url(r'^(?P<name>[A-Za-z0-9\._\+\-]+)$', views_search.search_for_name, name="doc_search_for_name"),
     url(r'^search/$', views_search.search, name="doc_search"),
     url(r'^in-last-call/$', views_search.drafts_in_last_call, name="drafts_in_last_call"),
     url(r'^ad/(?P<name>[\w.-]+)/$(?u)', views_search.docs_for_ad, name="docs_for_ad"),
-    (r'^ad2/(?P<name>[\w.-]+)/$(?u)', RedirectView.as_view(url='/doc/ad/%(name)s/', permanent=True)),
+    url(r'^ad2/(?P<name>[\w.-]+)/$(?u)', RedirectView.as_view(url='/doc/ad/%(name)s/', permanent=True)),
     url(r'^rfc-status-changes/$', views_status_change.rfc_status_changes, name='rfc_status_changes'),
     url(r'^start-rfc-status-change/(?:%(name)s/)?$' % settings.URL_REGEXPS, views_status_change.start_rfc_status_change, name='start_rfc_status_change'),
     url(r'^iesg/(?P<last_call_only>[A-Za-z0-9.-]+/)?$', views_search.drafts_in_iesg_process, name="drafts_in_iesg_process"),
@@ -75,8 +75,8 @@ urlpatterns = patterns('',
     url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.document_ballot, name="doc_ballot"),
     url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/position/$' % settings.URL_REGEXPS, views_ballot.edit_position),
     url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/emailposition/$' % settings.URL_REGEXPS, views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
-    (r'^%(name)s/(?:%(rev)s/)?doc.json$' % settings.URL_REGEXPS, views_doc.document_json),
-    (r'^%(name)s/ballotpopup/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.ballot_popup),
+    url(r'^%(name)s/(?:%(rev)s/)?doc.json$' % settings.URL_REGEXPS, views_doc.document_json),
+    url(r'^%(name)s/ballotpopup/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.ballot_popup),
     url(r'^(?P<name>[A-Za-z0-9._+-]+)/reviewrequest/', include("ietf.doc.urls_review")),
 
     url(r'^%(name)s/email-aliases/$' % settings.URL_REGEXPS, RedirectView.as_view(pattern_name='doc_email', permanent=False),name='doc_specific_email_aliases'),
@@ -120,12 +120,12 @@ urlpatterns = patterns('',
     url(r'^help/relationships/$', 'ietf.doc.views_help.relationship_help', name="relationship_help"),
     url(r'^help/relationships/(?P<subset>\w+)/$', 'ietf.doc.views_help.relationship_help', name="relationship_subset_help"),
 
-    (r'^%(name)s/meetings/?$' % settings.URL_REGEXPS, views_doc.all_presentations),
+    url(r'^%(name)s/meetings/?$' % settings.URL_REGEXPS, views_doc.all_presentations),
 
-    (r'^%(charter)s/' % settings.URL_REGEXPS, include('ietf.doc.urls_charter')),
-    (r'^%(name)s/conflict-review/' % settings.URL_REGEXPS, include('ietf.doc.urls_conflict_review')),
-    (r'^%(name)s/status-change/' % settings.URL_REGEXPS, include('ietf.doc.urls_status_change')),
-    (r'^%(name)s/material/' % settings.URL_REGEXPS, include('ietf.doc.urls_material')),
-    (r'^%(name)s/session/' % settings.URL_REGEXPS, include('ietf.doc.urls_material')),
-    (r'^(?P<name>[A-Za-z0-9._+-]+)/session/', include(session_patterns)),
-)
+    url(r'^%(charter)s/' % settings.URL_REGEXPS, include('ietf.doc.urls_charter')),
+    url(r'^%(name)s/conflict-review/' % settings.URL_REGEXPS, include('ietf.doc.urls_conflict_review')),
+    url(r'^%(name)s/status-change/' % settings.URL_REGEXPS, include('ietf.doc.urls_status_change')),
+    url(r'^%(name)s/material/' % settings.URL_REGEXPS, include('ietf.doc.urls_material')),
+    url(r'^%(name)s/session/' % settings.URL_REGEXPS, include('ietf.doc.urls_material')),
+    url(r'^(?P<name>[A-Za-z0-9._+-]+)/session/', include(session_patterns)),
+]
diff --git a/ietf/doc/urls_charter.py b/ietf/doc/urls_charter.py
index 4b708c52b..f298b7ced 100644
--- a/ietf/doc/urls_charter.py
+++ b/ietf/doc/urls_charter.py
@@ -1,9 +1,9 @@
 # Copyright The IETF Trust 2011, All Rights Reserved
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.conf import settings
 
-urlpatterns = patterns('',
+urlpatterns = [
     url(r'^state/$', "ietf.doc.views_charter.change_state", name='charter_change_state'),
     url(r'^title/$', "ietf.doc.views_charter.change_title", name='charter_change_title'),
     url(r'^(?P<option>initcharter|recharter|abandon)/$', "ietf.doc.views_charter.change_state", name='charter_startstop_process'),
@@ -16,4 +16,4 @@ urlpatterns = patterns('',
     url(r'^approve/$', "ietf.doc.views_charter.approve", name='charter_approve'),
     url(r'^submit/(?:(?P<option>initcharter|recharter)/)?$', "ietf.doc.views_charter.submit", name='charter_submit'),
     url(r'^withmilestones-%(rev)s.txt$' % settings.URL_REGEXPS, "ietf.doc.views_charter.charter_with_milestones_txt", name='charter_with_milestones_txt'),
-)
+]
diff --git a/ietf/doc/urls_conflict_review.py b/ietf/doc/urls_conflict_review.py
index 971e8a317..1434cd3ea 100644
--- a/ietf/doc/urls_conflict_review.py
+++ b/ietf/doc/urls_conflict_review.py
@@ -1,16 +1,13 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.doc.views_conflict_review',
-    url(r'^state/$',                 "change_state",  name='conflict_review_change_state'),
-    url(r'^submit/$',                "submit",        name='conflict_review_submit'),
-    url(r'^ad/$',                    "edit_ad",       name='conflict_review_ad'),
-    url(r'^approve/$',               "approve",       name='conflict_review_approve'),
-    url(r'^start_conflict_review/$', "start_review",  name='conflict_review_start'),
-)
-
-urlpatterns += patterns('ietf.doc.views_doc',
-    url(r'^telechat/$',              "telechat_date", name='conflict_review_telechat_date'),
-    url(r'^notices/$',               "edit_notify",  name='conflict_review_notices'),
-)
+urlpatterns = [
+    url(r'^state/$',                 "ietf.doc.views_conflict_review.change_state",  name='conflict_review_change_state'),
+    url(r'^submit/$',                "ietf.doc.views_conflict_review.submit",        name='conflict_review_submit'),
+    url(r'^ad/$',                    "ietf.doc.views_conflict_review.edit_ad",       name='conflict_review_ad'),
+    url(r'^approve/$',               "ietf.doc.views_conflict_review.approve",       name='conflict_review_approve'),
+    url(r'^start_conflict_review/$', "ietf.doc.views_conflict_review.start_review",  name='conflict_review_start'),
+    url(r'^telechat/$',              "ietf.doc.views_doc.telechat_date", name='conflict_review_telechat_date'),
+    url(r'^notices/$',               "ietf.doc.views_doc.edit_notify",  name='conflict_review_notices'),
+]
 
 
diff --git a/ietf/doc/urls_material.py b/ietf/doc/urls_material.py
index 1f104336d..e9c649f5b 100644
--- a/ietf/doc/urls_material.py
+++ b/ietf/doc/urls_material.py
@@ -1,6 +1,6 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.doc.views_material',
-    url(r'^(?P<action>state|title|abstract|revise)/$', "edit_material", name="material_edit"),
-)
+urlpatterns = [
+    url(r'^(?P<action>state|title|abstract|revise)/$', "ietf.doc.views_material.edit_material", name="material_edit"),
+]
 
diff --git a/ietf/doc/urls_review.py b/ietf/doc/urls_review.py
index 9256bb904..e8ec5c6a8 100644
--- a/ietf/doc/urls_review.py
+++ b/ietf/doc/urls_review.py
@@ -1,7 +1,7 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from ietf.doc import views_review
 
-urlpatterns = patterns('',
+urlpatterns = [
     url(r'^$', views_review.request_review),
     url(r'^(?P<request_id>[0-9]+)/$', views_review.review_request),
     url(r'^(?P<request_id>[0-9]+)/close/$', views_review.close_request),
@@ -10,5 +10,4 @@ urlpatterns = patterns('',
     url(r'^(?P<request_id>[0-9]+)/complete/$', views_review.complete_review),
     url(r'^(?P<request_id>[0-9]+)/searchmailarchive/$', views_review.search_mail_archive),
     url(r'^(?P<request_id>[0-9]+)/editcomment/$', views_review.edit_comment),
-)
-
+]
diff --git a/ietf/doc/urls_status_change.py b/ietf/doc/urls_status_change.py
index 6023abb4d..cd474932c 100644
--- a/ietf/doc/urls_status_change.py
+++ b/ietf/doc/urls_status_change.py
@@ -1,18 +1,15 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.doc.views_status_change',
-    url(r'^state/$',                 "change_state",   name='status_change_change_state'),
-    url(r'^submit/$',                "submit",         name='status_change_submit'),
-    url(r'^ad/$',                    "edit_ad",        name='status_change_ad'),
-    url(r'^title/$',                 "edit_title",     name='status_change_title'),
-    url(r'^approve/$',               "approve",        name='status_change_approve'),
-    url(r'^relations/$',             "edit_relations", name='status_change_relations'),
-    url(r'^last-call/$',             "last_call",      name='status_change_last_call'),
-)
-
-urlpatterns += patterns('ietf.doc.views_doc',
-    url(r'^telechat/$',              "telechat_date",  name='status_change_telechat_date'),
-    url(r'^notices/$',               "edit_notify",   name='status_change_notices'),
-)
+urlpatterns = [
+    url(r'^state/$',                 "ietf.doc.views_status_change.change_state",   name='status_change_change_state'),
+    url(r'^submit/$',                "ietf.doc.views_status_change.submit",         name='status_change_submit'),
+    url(r'^ad/$',                    "ietf.doc.views_status_change.edit_ad",        name='status_change_ad'),
+    url(r'^title/$',                 "ietf.doc.views_status_change.edit_title",     name='status_change_title'),
+    url(r'^approve/$',               "ietf.doc.views_status_change.approve",        name='status_change_approve'),
+    url(r'^relations/$',             "ietf.doc.views_status_change.edit_relations", name='status_change_relations'),
+    url(r'^last-call/$',             "ietf.doc.views_status_change.last_call",      name='status_change_last_call'),
+    url(r'^telechat/$',              "ietf.doc.views_doc.telechat_date",  name='status_change_telechat_date'),
+    url(r'^notices/$',               "ietf.doc.views_doc.edit_notify",   name='status_change_notices'),
+]
 
 
diff --git a/ietf/group/urls.py b/ietf/group/urls.py
index e94275b16..9a0983d22 100644
--- a/ietf/group/urls.py
+++ b/ietf/group/urls.py
@@ -1,19 +1,18 @@
 # Copyright The IETF Trust 2007, All Rights Reserved
 
-from django.conf.urls import patterns, include
+from django.conf.urls import url, include
 from django.conf import settings
 
-urlpatterns = patterns('',
-    (r'^$', 'ietf.group.views.active_groups'), 
-    (r'^groupmenu.json', 'ietf.group.views_ajax.group_menu_data', None, "group_menu_data"),
-    (r'^%(acronym)s.json$' % settings.URL_REGEXPS, 'ietf.group.views_ajax.group_json'),
-    (r'^chartering/$', 'ietf.group.views.chartering_groups'),
-    (r'^chartering/create/(?P<group_type>(wg|rg))/$', 'ietf.group.views_edit.edit', {'action': "charter"}, "group_create"),
-    (r'^concluded/$', 'ietf.group.views.concluded_groups'),
-    (r'^email-aliases/$', 'ietf.group.views.email_aliases'),
-    (r'^all-status/$', 'ietf.group.views.all_status'),
-
-    (r'^%(acronym)s/$' % settings.URL_REGEXPS, 'ietf.group.views.group_home', None, "group_home"),
-    (r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.group.views.active_groups'), 
+    url(r'^groupmenu.json', 'ietf.group.views_ajax.group_menu_data', None, "group_menu_data"),
+    url(r'^%(acronym)s.json$' % settings.URL_REGEXPS, 'ietf.group.views_ajax.group_json'),
+    url(r'^chartering/$', 'ietf.group.views.chartering_groups'),
+    url(r'^chartering/create/(?P<group_type>(wg|rg))/$', 'ietf.group.views_edit.edit', {'action': "charter"}, "group_create"),
+    url(r'^concluded/$', 'ietf.group.views.concluded_groups'),
+    url(r'^email-aliases/$', 'ietf.group.views.email_aliases'),
+    url(r'^all-status/$', 'ietf.group.views.all_status'),
 
+    url(r'^%(acronym)s/$' % settings.URL_REGEXPS, 'ietf.group.views.group_home', None, "group_home"),
+    url(r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
+]
diff --git a/ietf/group/urls_info.py b/ietf/group/urls_info.py
index 977696a23..9f9dfd4ea 100644
--- a/ietf/group/urls_info.py
+++ b/ietf/group/urls_info.py
@@ -1,25 +1,25 @@
 # Copyright The IETF Trust 2008, All Rights Reserved
 
-from django.conf.urls import patterns, include
+from django.conf.urls import url, include
 from django.views.generic import RedirectView
 from django.conf import settings
 
 from ietf.group import views, views_edit
 
-urlpatterns = patterns('',
-    (r'^$', views.active_groups), 
-    (r'^summary.txt', RedirectView.as_view(url='/wg/1wg-summary.txt', permanent=True)),
-    (r'^summary-by-area.txt', RedirectView.as_view(url='/wg/1wg-summary.txt', permanent=True)),
-    (r'^summary-by-acronym.txt', RedirectView.as_view(url='/wg/1wg-summary-by-acronym.txt', permanent=True)),
-    (r'^1wg-summary.txt', views.wg_summary_area),
-    (r'^1wg-summary-by-acronym.txt', views.wg_summary_acronym),
-    (r'^1wg-charters.txt', views.wg_charters),
-    (r'^1wg-charters-by-acronym.txt', views.wg_charters_by_acronym),
-    (r'^chartering/$', RedirectView.as_view(url='/group/chartering/', permanent=True)),
-    (r'^chartering/create/$', RedirectView.as_view(url='/group/chartering/create/%(group_type)s/', permanent=True)),
-    (r'^bofs/$', views.bofs),
-    (r'^email-aliases/$', 'ietf.group.views.email_aliases'),
-    (r'^bofs/create/$', views_edit.edit, {'action': "create", }, "bof_create"),
-    (r'^photos/$', views.chair_photos),
-    (r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
-)
+urlpatterns = [
+    url(r'^$', views.active_groups), 
+    url(r'^summary.txt', RedirectView.as_view(url='/wg/1wg-summary.txt', permanent=True)),
+    url(r'^summary-by-area.txt', RedirectView.as_view(url='/wg/1wg-summary.txt', permanent=True)),
+    url(r'^summary-by-acronym.txt', RedirectView.as_view(url='/wg/1wg-summary-by-acronym.txt', permanent=True)),
+    url(r'^1wg-summary.txt', views.wg_summary_area),
+    url(r'^1wg-summary-by-acronym.txt', views.wg_summary_acronym),
+    url(r'^1wg-charters.txt', views.wg_charters),
+    url(r'^1wg-charters-by-acronym.txt', views.wg_charters_by_acronym),
+    url(r'^chartering/$', RedirectView.as_view(url='/group/chartering/', permanent=True)),
+    url(r'^chartering/create/$', RedirectView.as_view(url='/group/chartering/create/%(group_type)s/', permanent=True)),
+    url(r'^bofs/$', views.bofs),
+    url(r'^email-aliases/$', 'ietf.group.views.email_aliases'),
+    url(r'^bofs/create/$', views_edit.edit, {'action': "create", }, "bof_create"),
+    url(r'^photos/$', views.chair_photos),
+    url(r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
+]
diff --git a/ietf/group/urls_info_details.py b/ietf/group/urls_info_details.py
index 16653ae52..3ddb89f68 100644
--- a/ietf/group/urls_info_details.py
+++ b/ietf/group/urls_info_details.py
@@ -1,40 +1,40 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.views.generic import RedirectView
 from ietf.group import views, views_review
 
-urlpatterns = patterns('',
-    (r'^$', 'ietf.group.views.group_home', None, "group_home"),
-    (r'^documents/txt/$', 'ietf.group.views.group_documents_txt'),
-    (r'^documents/$', 'ietf.group.views.group_documents', None, "group_docs"),
-    (r'^documents/manage/$', 'ietf.community.views.manage_list'),
-    (r'^documents/csv/$', 'ietf.community.views.export_to_csv'),
-    (r'^documents/feed/$', 'ietf.community.views.feed'),
-    (r'^documents/subscription/$', 'ietf.community.views.subscription'),
-    (r'^charter/$', 'ietf.group.views.group_about', None, 'group_charter'),
-    (r'^about/$', 'ietf.group.views.group_about', None, 'group_about'),
-    (r'^about/status/$', 'ietf.group.views.group_about_status'),
-    (r'^about/status/edit/$', 'ietf.group.views.group_about_status_edit'),
-    (r'^about/status/meeting/(?P<num>\d+)/$', 'ietf.group.views.group_about_status_meeting'),
-    (r'^history/$','ietf.group.views.history'),
-    (r'^email/$', 'ietf.group.views.email'),
-    (r'^deps/(?P<output_type>[\w-]+)/$', 'ietf.group.views.dependencies'),
-    (r'^meetings/$', 'ietf.group.views.meetings'),
-    (r'^edit/$', 'ietf.group.views_edit.edit', {'action': "edit"}, "group_edit"),
-    (r'^conclude/$', 'ietf.group.views_edit.conclude'),
-    (r'^milestones/$', 'ietf.group.milestones.edit_milestones', {'milestone_set': "current"}, "group_edit_milestones"),
-    (r'^milestones/charter/$', 'ietf.group.milestones.edit_milestones', {'milestone_set': "charter"}, "group_edit_charter_milestones"),
-    (r'^milestones/charter/reset/$', 'ietf.group.milestones.reset_charter_milestones', None, "group_reset_charter_milestones"),
-    (r'^workflow/$', 'ietf.group.views_edit.customize_workflow'),
-    (r'^materials/$', 'ietf.group.views.materials', None, "group_materials"),
-    (r'^materials/new/$', 'ietf.doc.views_material.choose_material_type'),
-    (r'^materials/new/(?P<doc_type>[\w-]+)/$', 'ietf.doc.views_material.edit_material', { 'action': "new" }, "group_new_material"),
-    (r'^archives/$', 'ietf.group.views.derived_archives'),
-    (r'^photos/$', views.group_photos),
-    (r'^reviews/$', views_review.review_requests),
-    (r'^reviews/manage/(?P<assignment_status>assigned|unassigned)/$', views_review.manage_review_requests),
-    (r'^reviews/email-assignments/$', views_review.email_open_review_assignments),
-    (r'^reviewers/$', views_review.reviewer_overview),
-    (r'^reviewers/(?P<reviewer_email>[\w%+-.@]+)/settings/$', views_review.change_reviewer_settings),
-    (r'^secretarysettings/$', views_review.change_review_secretary_settings),
+urlpatterns = [
+    url(r'^$', 'ietf.group.views.group_home', None, "group_home"),
+    url(r'^documents/txt/$', 'ietf.group.views.group_documents_txt'),
+    url(r'^documents/$', 'ietf.group.views.group_documents', None, "group_docs"),
+    url(r'^documents/manage/$', 'ietf.community.views.manage_list'),
+    url(r'^documents/csv/$', 'ietf.community.views.export_to_csv'),
+    url(r'^documents/feed/$', 'ietf.community.views.feed'),
+    url(r'^documents/subscription/$', 'ietf.community.views.subscription'),
+    url(r'^charter/$', 'ietf.group.views.group_about', None, 'group_charter'),
+    url(r'^about/$', 'ietf.group.views.group_about', None, 'group_about'),
+    url(r'^about/status/$', 'ietf.group.views.group_about_status'),
+    url(r'^about/status/edit/$', 'ietf.group.views.group_about_status_edit'),
+    url(r'^about/status/meeting/(?P<num>\d+)/$', 'ietf.group.views.group_about_status_meeting'),
+    url(r'^history/$','ietf.group.views.history'),
+    url(r'^email/$', 'ietf.group.views.email'),
+    url(r'^deps/(?P<output_type>[\w-]+)/$', 'ietf.group.views.dependencies'),
+    url(r'^meetings/$', 'ietf.group.views.meetings'),
+    url(r'^edit/$', 'ietf.group.views_edit.edit', {'action': "edit"}, "group_edit"),
+    url(r'^conclude/$', 'ietf.group.views_edit.conclude'),
+    url(r'^milestones/$', 'ietf.group.milestones.edit_milestones', {'milestone_set': "current"}, "group_edit_milestones"),
+    url(r'^milestones/charter/$', 'ietf.group.milestones.edit_milestones', {'milestone_set': "charter"}, "group_edit_charter_milestones"),
+    url(r'^milestones/charter/reset/$', 'ietf.group.milestones.reset_charter_milestones', None, "group_reset_charter_milestones"),
+    url(r'^workflow/$', 'ietf.group.views_edit.customize_workflow'),
+    url(r'^materials/$', 'ietf.group.views.materials', None, "group_materials"),
+    url(r'^materials/new/$', 'ietf.doc.views_material.choose_material_type'),
+    url(r'^materials/new/(?P<doc_type>[\w-]+)/$', 'ietf.doc.views_material.edit_material', { 'action': "new" }, "group_new_material"),
+    url(r'^archives/$', 'ietf.group.views.derived_archives'),
+    url(r'^photos/$', views.group_photos),
+    url(r'^reviews/$', views_review.review_requests),
+    url(r'^reviews/manage/(?P<assignment_status>assigned|unassigned)/$', views_review.manage_review_requests),
+    url(r'^reviews/email-assignments/$', views_review.email_open_review_assignments),
+    url(r'^reviewers/$', views_review.reviewer_overview),
+    url(r'^reviewers/(?P<reviewer_email>[\w%+-.@]+)/settings/$', views_review.change_reviewer_settings),
+    url(r'^secretarysettings/$', views_review.change_review_secretary_settings),
     url(r'^email-aliases/$', RedirectView.as_view(pattern_name='ietf.group.views.email',permanent=False),name='old_group_email_aliases'),
-)
+]
diff --git a/ietf/group/urls_stream.py b/ietf/group/urls_stream.py
index 8559212de..f19efbff8 100644
--- a/ietf/group/urls_stream.py
+++ b/ietf/group/urls_stream.py
@@ -1,12 +1,12 @@
 # Copyright The IETF Trust 2008, All Rights Reserved
 
-from django.conf.urls import patterns
+from django.conf.urls import url
 from django.conf import settings
 
 import views_stream
 
-urlpatterns = patterns('',
-     (r'^$', views_stream.streams),
-     (r'^%(acronym)s/$' % settings.URL_REGEXPS, views_stream.stream_documents, None),
-     (r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, views_stream.stream_edit),
-)
+urlpatterns = [
+    url(r'^$', views_stream.streams),
+    url(r'^%(acronym)s/$' % settings.URL_REGEXPS, views_stream.stream_documents, None),
+    url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, views_stream.stream_edit),
+]
diff --git a/ietf/help/urls.py b/ietf/help/urls.py
index 7b1c3ad7a..a12cbc84b 100644
--- a/ietf/help/urls.py
+++ b/ietf/help/urls.py
@@ -1,8 +1,8 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('',
+urlpatterns = [
     url(r'^state/(?P<doc>[-\w]+)/(?P<type>[-\w]+)/?$', 'ietf.help.views.state'),
     url(r'^state/(?P<doc>[-\w]+)/?$', 'ietf.help.views.state'),
     url(r'^state/?$', 'ietf.help.views.state_index'),
-)
+]
 
diff --git a/ietf/iesg/urls.py b/ietf/iesg/urls.py
index 7d4871c28..91571e113 100644
--- a/ietf/iesg/urls.py
+++ b/ietf/iesg/urls.py
@@ -32,27 +32,27 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from django.conf.urls import patterns
+from django.conf.urls import url
 from django.views.generic import RedirectView
 from django.conf import settings
 
-urlpatterns = patterns('',
-    (r'^telechat/.*$', RedirectView.as_view(url='https://www.ietf.org/iesg/minutes.html', permanent=True)),
-    (r'^ann/(?:ind|new|prev)/$', RedirectView.as_view(url="/iesg/decisions/", permanent=True)),
-    (r'^telechatdates/$', RedirectView.as_view(url='/admin/iesg/telechatdate/', permanent=True)),
+urlpatterns = [
+    url(r'^telechat/.*$', RedirectView.as_view(url='https://www.ietf.org/iesg/minutes.html', permanent=True)),
+    url(r'^ann/(?:ind|new|prev)/$', RedirectView.as_view(url="/iesg/decisions/", permanent=True)),
+    url(r'^telechatdates/$', RedirectView.as_view(url='/admin/iesg/telechatdate/', permanent=True)),
 
-    (r'^decisions/(?:(?P<year>[0-9]{4})/)?$', "ietf.iesg.views.review_decisions"),
-    (r'^agenda/(?:%(date)s/)?$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda"),
-    (r'^agenda/(?:%(date)s/)?agenda.txt$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_txt"),
-    (r'^agenda/(?:%(date)s/)?agenda.json$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_json"),
-    (r'^agenda/(?:%(date)s/)?scribe_template.html$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_scribe_template"),
-    (r'^agenda/(?:%(date)s/)?moderator_package.html$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_moderator_package"),
-    (r'^agenda/(?:%(date)s/)?agenda_package.txt$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_package"),
+    url(r'^decisions/(?:(?P<year>[0-9]{4})/)?$', "ietf.iesg.views.review_decisions"),
+    url(r'^agenda/(?:%(date)s/)?$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda"),
+    url(r'^agenda/(?:%(date)s/)?agenda.txt$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_txt"),
+    url(r'^agenda/(?:%(date)s/)?agenda.json$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_json"),
+    url(r'^agenda/(?:%(date)s/)?scribe_template.html$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_scribe_template"),
+    url(r'^agenda/(?:%(date)s/)?moderator_package.html$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_moderator_package"),
+    url(r'^agenda/(?:%(date)s/)?agenda_package.txt$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_package"),
 
-    (r'^agenda/documents.txt$', "ietf.iesg.views.agenda_documents_txt"),
-    (r'^agenda/documents/$', "ietf.iesg.views.agenda_documents"),
-    (r'^agenda/telechat-(?:%(date)s-)?docs.tgz' % settings.URL_REGEXPS, "ietf.iesg.views.telechat_docs_tarfile"),
-    (r'^discusses/$', "ietf.iesg.views.discusses"),
-    (r'^milestones/$', "ietf.iesg.views.milestones_needing_review"),
-    (r'^photos/$', "ietf.iesg.views.photos"),
-)
+    url(r'^agenda/documents.txt$', "ietf.iesg.views.agenda_documents_txt"),
+    url(r'^agenda/documents/$', "ietf.iesg.views.agenda_documents"),
+    url(r'^agenda/telechat-(?:%(date)s-)?docs.tgz' % settings.URL_REGEXPS, "ietf.iesg.views.telechat_docs_tarfile"),
+    url(r'^discusses/$', "ietf.iesg.views.discusses"),
+    url(r'^milestones/$', "ietf.iesg.views.milestones_needing_review"),
+    url(r'^photos/$', "ietf.iesg.views.photos"),
+]
diff --git a/ietf/ietfauth/urls.py b/ietf/ietfauth/urls.py
index bb40446a5..1bc247554 100644
--- a/ietf/ietfauth/urls.py
+++ b/ietf/ietfauth/urls.py
@@ -1,25 +1,25 @@
 # Copyright The IETF Trust 2007, 2009, All Rights Reserved
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.contrib.auth.views import login, logout
 
 from ietf.ietfauth.views import add_account_whitelist
 
-urlpatterns = patterns('ietf.ietfauth.views',
-        url(r'^$', 'index'),
-#        url(r'^login/$', 'ietf_login'),
+urlpatterns = [
+        url(r'^$', 'ietf.ietfauth.views.index'),
+#        url(r'^login/$', 'ietf.ietfauth.views.ietf_login'),
         url(r'^login/$', login),
         url(r'^logout/$', logout),
-#        url(r'^loggedin/$', 'ietf_loggedin'),
-#        url(r'^loggedout/$', 'logged_out'),
-        url(r'^profile/$', 'profile'),
-#        (r'^login/(?P<user>[a-z0-9.@]+)/(?P<passwd>.+)$', 'url_login'),
-        url(r'^testemail/$', 'test_email'),
-        url(r'^create/$', 'create_account'),
-        url(r'^create/confirm/(?P<auth>[^/]+)/$', 'confirm_account'),
-        url(r'^reset/$', 'password_reset'),
-        url(r'^reset/confirm/(?P<auth>[^/]+)/$', 'confirm_password_reset'),
-        url(r'^confirmnewemail/(?P<auth>[^/]+)/$', 'confirm_new_email'),
-        (r'whitelist/add/?$', add_account_whitelist),
-        url(r'^review/$', 'review_overview'),
-)
+#        url(r'^loggedin/$', 'ietf.ietfauth.views.ietf_loggedin'),
+#        url(r'^loggedout/$', 'ietf.ietfauth.views.logged_out'),
+        url(r'^profile/$', 'ietf.ietfauth.views.profile'),
+#        (r'^login/(?P<user>[a-z0-9.@]+)/(?P<passwd>.+)$', 'ietf.ietfauth.views.url_login'),
+        url(r'^testemail/$', 'ietf.ietfauth.views.test_email'),
+        url(r'^create/$', 'ietf.ietfauth.views.create_account'),
+        url(r'^create/confirm/(?P<auth>[^/]+)/$', 'ietf.ietfauth.views.confirm_account'),
+        url(r'^reset/$', 'ietf.ietfauth.views.password_reset'),
+        url(r'^reset/confirm/(?P<auth>[^/]+)/$', 'ietf.ietfauth.views.confirm_password_reset'),
+        url(r'^confirmnewemail/(?P<auth>[^/]+)/$', 'ietf.ietfauth.views.confirm_new_email'),
+        url(r'whitelist/add/?$', add_account_whitelist),
+        url(r'^review/$', 'ietf.ietfauth.views.review_overview'),
+]
diff --git a/ietf/ipr/urls.py b/ietf/ipr/urls.py
index ad6e8de47..26eb08e4b 100644
--- a/ietf/ipr/urls.py
+++ b/ietf/ipr/urls.py
@@ -1,28 +1,28 @@
 # Copyright The IETF Trust 2007, All Rights Reserved
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.views.generic import RedirectView
 from django.core.urlresolvers import reverse_lazy
 
-urlpatterns = patterns('ietf.ipr.views',
-     url(r'^$', 'showlist', name='ipr_showlist'),
-     (r'^about/$', 'about'),
-     url(r'^admin/$', RedirectView.as_view(url=reverse_lazy('ipr_admin',kwargs={'state':'pending'}), permanent=True),name="ipr_admin_main"),
-     url(r'^admin/(?P<state>pending|removed|parked)/$', 'admin', name='ipr_admin'),
-     url(r'^ajax/search/$', 'ajax_search', name='ipr_ajax_search'),
-     url(r'^by-draft/$', 'by_draft_txt'),
-     url(r'^by-draft-recursive/$', 'by_draft_recursive_txt'),
-     url(r'^(?P<id>\d+)/$', 'show', name='ipr_show'),
-     url(r'^(?P<id>\d+)/addcomment/$', 'add_comment', name='ipr_add_comment'),
-     url(r'^(?P<id>\d+)/addemail/$', 'add_email', name='ipr_add_email'),
-     url(r'^(?P<id>\d+)/edit/$', 'edit', name='ipr_edit'),
-     url(r'^(?P<id>\d+)/email/$', 'email', name='ipr_email'),
-     url(r'^(?P<id>\d+)/history/$', 'history', name='ipr_history'),
-     url(r'^(?P<id>\d+)/notify/(?P<type>update|posted)/$', 'notify', name='ipr_notify'),
-     url(r'^(?P<id>\d+)/post/$', 'post', name='ipr_post'),
-     url(r'^(?P<id>\d+)/state/$', 'state', name='ipr_state'),
-     (r'^update/$', RedirectView.as_view(url=reverse_lazy('ipr_showlist'), permanent=True)),
-     url(r'^update/(?P<id>\d+)/$', 'update', name='ipr_update'),
-     url(r'^new-(?P<type>(specific|generic|third-party))/$', 'new', name='ipr_new'),
-     url(r'^search/$', 'search', name="ipr_search"),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.ipr.views.showlist', name='ipr_showlist'),
+    url(r'^about/$', 'ietf.ipr.views.about'),
+    url(r'^admin/$', RedirectView.as_view(url=reverse_lazy('ipr_admin',kwargs={'state':'pending'}), permanent=True),name="ipr_admin_main"),
+    url(r'^admin/(?P<state>pending|removed|parked)/$', 'ietf.ipr.views.admin', name='ipr_admin'),
+    url(r'^ajax/search/$', 'ietf.ipr.views.ajax_search', name='ipr_ajax_search'),
+    url(r'^by-draft/$', 'ietf.ipr.views.by_draft_txt'),
+    url(r'^by-draft-recursive/$', 'ietf.ipr.views.by_draft_recursive_txt'),
+    url(r'^(?P<id>\d+)/$', 'ietf.ipr.views.show', name='ipr_show'),
+    url(r'^(?P<id>\d+)/addcomment/$', 'ietf.ipr.views.add_comment', name='ipr_add_comment'),
+    url(r'^(?P<id>\d+)/addemail/$', 'ietf.ipr.views.add_email', name='ipr_add_email'),
+    url(r'^(?P<id>\d+)/edit/$', 'ietf.ipr.views.edit', name='ipr_edit'),
+    url(r'^(?P<id>\d+)/email/$', 'ietf.ipr.views.email', name='ipr_email'),
+    url(r'^(?P<id>\d+)/history/$', 'ietf.ipr.views.history', name='ipr_history'),
+    url(r'^(?P<id>\d+)/notify/(?P<type>update|posted)/$', 'ietf.ipr.views.notify', name='ipr_notify'),
+    url(r'^(?P<id>\d+)/post/$', 'ietf.ipr.views.post', name='ipr_post'),
+    url(r'^(?P<id>\d+)/state/$', 'ietf.ipr.views.state', name='ipr_state'),
+    url(r'^update/$', RedirectView.as_view(url=reverse_lazy('ipr_showlist'), permanent=True)),
+    url(r'^update/(?P<id>\d+)/$', 'ietf.ipr.views.update', name='ipr_update'),
+    url(r'^new-(?P<type>(specific|generic|third-party))/$', 'ietf.ipr.views.new', name='ipr_new'),
+    url(r'^search/$', 'ietf.ipr.views.search', name="ipr_search"),
+]
diff --git a/ietf/liaisons/urls.py b/ietf/liaisons/urls.py
index cad76b4c7..8e242d5f9 100644
--- a/ietf/liaisons/urls.py
+++ b/ietf/liaisons/urls.py
@@ -1,38 +1,38 @@
 # Copyright The IETF Trust 2007, All Rights Reserved
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.views.generic import RedirectView, TemplateView
 
-urlpatterns = patterns('',
-    (r'^help/$', TemplateView.as_view(template_name='liaisons/help.html')),
+urlpatterns = [
+    url(r'^help/$', TemplateView.as_view(template_name='liaisons/help.html')),
     url(r'^help/fields/$', TemplateView.as_view(template_name='liaisons/field_help.html'), name='liaisons_field_help'),
-    (r'^help/from_ietf/$', TemplateView.as_view(template_name='liaisons/guide_from_ietf.html')),
-    (r'^help/to_ietf/$', TemplateView.as_view(template_name='liaisons/guide_to_ietf.html')),
-    (r'^managers/$', RedirectView.as_view(url='https://www.ietf.org/liaison/managers.html', permanent=True)),
-)
+    url(r'^help/from_ietf/$', TemplateView.as_view(template_name='liaisons/guide_from_ietf.html')),
+    url(r'^help/to_ietf/$', TemplateView.as_view(template_name='liaisons/guide_to_ietf.html')),
+    url(r'^managers/$', RedirectView.as_view(url='https://www.ietf.org/liaison/managers.html', permanent=True)),
+]
 
 # AJAX views
-urlpatterns += patterns('ietf.liaisons.views',
-    (r'^ajax/get_info/$', 'ajax_get_liaison_info'),
-    (r'^ajax/select2search/$', 'ajax_select2_search_liaison_statements'),
-)
+urlpatterns += [ 
+    url(r'^ajax/get_info/$', 'ietf.liaisons.views.ajax_get_liaison_info'),
+    url(r'^ajax/select2search/$', 'ietf.liaisons.views.ajax_select2_search_liaison_statements'),
+]
 
 # Views
-urlpatterns += patterns('ietf.liaisons.views',
-    (r'^$', 'liaison_list'),
-    (r'^(?P<state>(posted|pending|dead))/', 'liaison_list'),
-    (r'^(?P<object_id>\d+)/$', 'liaison_detail'),
-    (r'^(?P<object_id>\d+)/addcomment/$', 'add_comment'),
-    (r'^(?P<object_id>\d+)/edit/$', 'liaison_edit'),
-    (r'^(?P<object_id>\d+)/edit-attachment/(?P<doc_id>[A-Za-z0-9._+-]+)$', 'liaison_edit_attachment'),
-    (r'^(?P<object_id>\d+)/delete-attachment/(?P<attach_id>[A-Za-z0-9._+-]+)$', 'liaison_delete_attachment'),
-    (r'^(?P<object_id>\d+)/history/$', 'liaison_history'),
-    (r'^(?P<object_id>\d+)/reply/$', 'liaison_reply'),
-    (r'^(?P<object_id>\d+)/resend/$', 'liaison_resend'),
-    (r'^add/(?P<type>(incoming|outgoing))/$', 'liaison_add'),
+urlpatterns += [ 
+    url(r'^$', 'ietf.liaisons.views.liaison_list'),
+    url(r'^(?P<state>(posted|pending|dead))/', 'ietf.liaisons.views.liaison_list'),
+    url(r'^(?P<object_id>\d+)/$', 'ietf.liaisons.views.liaison_detail'),
+    url(r'^(?P<object_id>\d+)/addcomment/$', 'ietf.liaisons.views.add_comment'),
+    url(r'^(?P<object_id>\d+)/edit/$', 'ietf.liaisons.views.liaison_edit'),
+    url(r'^(?P<object_id>\d+)/edit-attachment/(?P<doc_id>[A-Za-z0-9._+-]+)$', 'ietf.liaisons.views.liaison_edit_attachment'),
+    url(r'^(?P<object_id>\d+)/delete-attachment/(?P<attach_id>[A-Za-z0-9._+-]+)$', 'ietf.liaisons.views.liaison_delete_attachment'),
+    url(r'^(?P<object_id>\d+)/history/$', 'ietf.liaisons.views.liaison_history'),
+    url(r'^(?P<object_id>\d+)/reply/$', 'ietf.liaisons.views.liaison_reply'),
+    url(r'^(?P<object_id>\d+)/resend/$', 'ietf.liaisons.views.liaison_resend'),
+    url(r'^add/(?P<type>(incoming|outgoing))/$', 'ietf.liaisons.views.liaison_add'),
 
     # Redirects for backwards compatibility
-    (r'^add/$', 'redirect_add'),
-    (r'^for_approval/$', 'redirect_for_approval'),
-    (r'^for_approval/(?P<object_id>\d+)/$', 'redirect_for_approval'),
-)
+    url(r'^add/$', 'ietf.liaisons.views.redirect_add'),
+    url(r'^for_approval/$', 'ietf.liaisons.views.redirect_for_approval'),
+    url(r'^for_approval/(?P<object_id>\d+)/$', 'ietf.liaisons.views.redirect_for_approval'),
+]
\ No newline at end of file
diff --git a/ietf/mailinglists/urls.py b/ietf/mailinglists/urls.py
index 0528f8f90..ae25392c5 100644
--- a/ietf/mailinglists/urls.py
+++ b/ietf/mailinglists/urls.py
@@ -1,11 +1,11 @@
 # Copyright The IETF Trust 2007, All Rights Reserved
 
-from django.conf.urls import patterns
+from django.conf.urls import url
 from django.views.generic import RedirectView
 
-urlpatterns = patterns('',
-     (r'^wg/$', 'ietf.mailinglists.views.groups'),
-     (r'^nonwg/$', RedirectView.as_view(url='https://www.ietf.org/list/nonwg.html', permanent=True)),
-     (r'^nonwg/update/$', RedirectView.as_view(url='https://www.ietf.org/list/nonwg.html', permanent=True)),
-     (r'^request/$', RedirectView.as_view(url='https://www.ietf.org/list/request.html', permanent=True)),
-)
+urlpatterns = [
+    url(r'^wg/$', 'ietf.mailinglists.views.groups'),
+    url(r'^nonwg/$', RedirectView.as_view(url='https://www.ietf.org/list/nonwg.html', permanent=True)),
+    url(r'^nonwg/update/$', RedirectView.as_view(url='https://www.ietf.org/list/nonwg.html', permanent=True)),
+    url(r'^request/$', RedirectView.as_view(url='https://www.ietf.org/list/request.html', permanent=True)),
+]
diff --git a/ietf/mailtrigger/urls.py b/ietf/mailtrigger/urls.py
index b50f49c74..ff8aee33a 100644
--- a/ietf/mailtrigger/urls.py
+++ b/ietf/mailtrigger/urls.py
@@ -1,11 +1,11 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.views.generic import RedirectView
 from django.core.urlresolvers import reverse_lazy
 
-urlpatterns = patterns('ietf.mailtrigger.views',
+urlpatterns = [
     url(r'^$', RedirectView.as_view(url=reverse_lazy('mailtrigger_show_triggers'), permanent=True)),
-    url(r'^name/$', 'show_triggers',  name='mailtrigger_show_triggers' ),
-    url(r'^name/(?P<mailtrigger_slug>[-\w]+)/$', 'show_triggers' ),
-    url(r'^recipient/$', 'show_recipients' ),
-    url(r'^recipient/(?P<recipient_slug>[-\w]+)/$', 'show_recipients' ),
-)
+    url(r'^name/$', 'ietf.mailtrigger.views.show_triggers',  name='mailtrigger_show_triggers' ),
+    url(r'^name/(?P<mailtrigger_slug>[-\w]+)/$', 'ietf.mailtrigger.views.show_triggers' ),
+    url(r'^recipient/$', 'ietf.mailtrigger.views.show_recipients' ),
+    url(r'^recipient/(?P<recipient_slug>[-\w]+)/$', 'ietf.mailtrigger.views.show_recipients' ),
+]
diff --git a/ietf/nomcom/urls.py b/ietf/nomcom/urls.py
index f62140050..1136515fe 100644
--- a/ietf/nomcom/urls.py
+++ b/ietf/nomcom/urls.py
@@ -1,48 +1,45 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
 from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
 from ietf.nomcom import views
 
-urlpatterns = patterns('ietf.nomcom.views',
-    url(r'^$', 'index'),
-    url(r'^ann/$', 'announcements'),
-    url(r'^(?P<year>\d{4})/private/$', 'private_index', name='nomcom_private_index'),
-    url(r'^(?P<year>\d{4})/private/key/$', 'private_key', name='nomcom_private_key'),
-    url(r'^(?P<year>\d{4})/private/help/$', 'configuration_help', name='nomcom_chair_help'),
-    url(r'^(?P<year>\d{4})/private/nominate/$', 'private_nominate', name='nomcom_private_nominate'),
-    url(r'^(?P<year>\d{4})/private/nominate/newperson$', 'private_nominate_newperson', name='nomcom_private_nominate_newperson'),
-    url(r'^(?P<year>\d{4})/private/feedback/$', 'private_feedback', name='nomcom_private_feedback'),
-    url(r'^(?P<year>\d{4})/private/feedback-email/$', 'private_feedback_email', name='nomcom_private_feedback_email'),
-    url(r'^(?P<year>\d{4})/private/questionnaire-response/$', 'private_questionnaire', name='nomcom_private_questionnaire'),
-    url(r'^(?P<year>\d{4})/private/view-feedback/$', 'view_feedback', name='nomcom_view_feedback'),
-    url(r'^(?P<year>\d{4})/private/view-feedback/unrelated/$', 'view_feedback_unrelated', name='nomcom_view_feedback_unrelated'),
-    url(r'^(?P<year>\d{4})/private/view-feedback/pending/$', 'view_feedback_pending', name='nomcom_view_feedback_pending'),
-    url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', 'view_feedback_nominee', name='nomcom_view_feedback_nominee'),
-    url(r'^(?P<year>\d{4})/private/edit/nominee/(?P<nominee_id>\d+)$', 'edit_nominee', name='nomcom_edit_nominee'),
+urlpatterns = [
+    url(r'^$', 'ietf.nomcom.views.index'),
+    url(r'^ann/$', 'ietf.nomcom.views.announcements'),
+    url(r'^(?P<year>\d{4})/private/$', 'ietf.nomcom.views.private_index', name='nomcom_private_index'),
+    url(r'^(?P<year>\d{4})/private/key/$', 'ietf.nomcom.views.private_key', name='nomcom_private_key'),
+    url(r'^(?P<year>\d{4})/private/help/$', 'ietf.nomcom.views.configuration_help', name='nomcom_chair_help'),
+    url(r'^(?P<year>\d{4})/private/nominate/$', 'ietf.nomcom.views.private_nominate', name='nomcom_private_nominate'),
+    url(r'^(?P<year>\d{4})/private/nominate/newperson$', 'ietf.nomcom.views.private_nominate_newperson', name='nomcom_private_nominate_newperson'),
+    url(r'^(?P<year>\d{4})/private/feedback/$', 'ietf.nomcom.views.private_feedback', name='nomcom_private_feedback'),
+    url(r'^(?P<year>\d{4})/private/feedback-email/$', 'ietf.nomcom.views.private_feedback_email', name='nomcom_private_feedback_email'),
+    url(r'^(?P<year>\d{4})/private/questionnaire-response/$', 'ietf.nomcom.views.private_questionnaire', name='nomcom_private_questionnaire'),
+    url(r'^(?P<year>\d{4})/private/view-feedback/$', 'ietf.nomcom.views.view_feedback', name='nomcom_view_feedback'),
+    url(r'^(?P<year>\d{4})/private/view-feedback/unrelated/$', 'ietf.nomcom.views.view_feedback_unrelated', name='nomcom_view_feedback_unrelated'),
+    url(r'^(?P<year>\d{4})/private/view-feedback/pending/$', 'ietf.nomcom.views.view_feedback_pending', name='nomcom_view_feedback_pending'),
+    url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', 'ietf.nomcom.views.view_feedback_nominee', name='nomcom_view_feedback_nominee'),
+    url(r'^(?P<year>\d{4})/private/edit/nominee/(?P<nominee_id>\d+)$', 'ietf.nomcom.views.edit_nominee', name='nomcom_edit_nominee'),
     url(r'^(?P<year>\d{4})/private/merge-nominee/?$', views.private_merge_nominee),
     url(r'^(?P<year>\d{4})/private/merge-person/?$', views.private_merge_person),
 #    url(r'^(?P<year>\d{4})/private/send-reminder-mail/$', RedirectView.as_view(url=reverse_lazy('nomcom_send_reminder_mail',kwargs={'year':year,'type':'accept'}))),
-    url(r'^(?P<year>\d{4})/private/send-reminder-mail/(?P<type>\w+)/$', 'send_reminder_mail', name='nomcom_send_reminder_mail'),
+    url(r'^(?P<year>\d{4})/private/send-reminder-mail/(?P<type>\w+)/$', 'ietf.nomcom.views.send_reminder_mail', name='nomcom_send_reminder_mail'),
     url(r'^(?P<year>\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='nomcom_edit_members'),
-    url(r'^(?P<year>\d{4})/private/edit-nomcom/$', 'edit_nomcom', name='nomcom_edit_nomcom'),
-    url(r'^(?P<year>\d{4})/private/chair/templates/$', 'list_templates', name='nomcom_list_templates'),
-    url(r'^(?P<year>\d{4})/private/chair/templates/(?P<template_id>\d+)/$', 'edit_template', name='nomcom_edit_template'),
-    url(r'^(?P<year>\d{4})/private/chair/position/$', 'list_positions', name='nomcom_list_positions'),
-    url(r'^(?P<year>\d{4})/private/chair/position/add/$', 'edit_position', name='nomcom_add_position'),
-    url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/$', 'edit_position', name='nomcom_edit_position'),
-    url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/remove/$', 'remove_position', name='nomcom_remove_position'),
-
-    url(r'^(?P<year>\d{4})/$', 'year_index', name='nomcom_year_index'),
-    url(r'^(?P<year>\d{4})/requirements/$', 'requirements', name='nomcom_requirements'),
-    url(r'^(?P<year>\d{4})/expertise/$', 'requirements', name='nomcom_requirements'),
-    url(r'^(?P<year>\d{4})/questionnaires/$', 'questionnaires', name='nomcom_questionnaires'),
-    url(r'^(?P<year>\d{4})/feedback/$', 'public_feedback', name='nomcom_public_feedback'),
-    url(r'^(?P<year>\d{4})/nominate/$', 'public_nominate', name='nomcom_public_nominate'),
-    url(r'^(?P<year>\d{4})/nominate/newperson$', 'public_nominate_newperson', name='nomcom_public_nominate_newperson'),
-    url(r'^(?P<year>\d{4})/process-nomination-status/(?P<nominee_position_id>\d+)/(?P<state>[\w]+)/(?P<date>[\d]+)/(?P<hash>[a-f0-9]+)/$', 'process_nomination_status', name='nomcom_process_nomination_status'),
-)
+    url(r'^(?P<year>\d{4})/private/edit-nomcom/$', 'ietf.nomcom.views.edit_nomcom', name='nomcom_edit_nomcom'),
+    url(r'^(?P<year>\d{4})/private/chair/templates/$', 'ietf.nomcom.views.list_templates', name='nomcom_list_templates'),
+    url(r'^(?P<year>\d{4})/private/chair/templates/(?P<template_id>\d+)/$', 'ietf.nomcom.views.edit_template', name='nomcom_edit_template'),
+    url(r'^(?P<year>\d{4})/private/chair/position/$', 'ietf.nomcom.views.list_positions', name='nomcom_list_positions'),
+    url(r'^(?P<year>\d{4})/private/chair/position/add/$', 'ietf.nomcom.views.edit_position', name='nomcom_add_position'),
+    url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/$', 'ietf.nomcom.views.edit_position', name='nomcom_edit_position'),
+    url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/remove/$', 'ietf.nomcom.views.remove_position', name='nomcom_remove_position'),
 
+    url(r'^(?P<year>\d{4})/$', 'ietf.nomcom.views.year_index', name='nomcom_year_index'),
+    url(r'^(?P<year>\d{4})/requirements/$', 'ietf.nomcom.views.requirements', name='nomcom_requirements'),
+    url(r'^(?P<year>\d{4})/expertise/$', 'ietf.nomcom.views.requirements', name='nomcom_requirements'),
+    url(r'^(?P<year>\d{4})/questionnaires/$', 'ietf.nomcom.views.questionnaires', name='nomcom_questionnaires'),
+    url(r'^(?P<year>\d{4})/feedback/$', 'ietf.nomcom.views.public_feedback', name='nomcom_public_feedback'),
+    url(r'^(?P<year>\d{4})/nominate/$', 'ietf.nomcom.views.public_nominate', name='nomcom_public_nominate'),
+    url(r'^(?P<year>\d{4})/nominate/newperson$', 'ietf.nomcom.views.public_nominate_newperson', name='nomcom_public_nominate_newperson'),
+    url(r'^(?P<year>\d{4})/process-nomination-status/(?P<nominee_position_id>\d+)/(?P<state>[\w]+)/(?P<date>[\d]+)/(?P<hash>[a-f0-9]+)/$', 'ietf.nomcom.views.process_nomination_status', name='nomcom_process_nomination_status'),
 # use the generic view from message
-urlpatterns += patterns('',
     url(r'^ann/(?P<message_id>\d+)/$', 'ietf.message.views.message', {'group_type': "nomcom" }, "nomcom_announcement"),
-)
+]
diff --git a/ietf/person/urls.py b/ietf/person/urls.py
index 2cdb761f9..a89d5b974 100644
--- a/ietf/person/urls.py
+++ b/ietf/person/urls.py
@@ -1,8 +1,8 @@
-from django.conf.urls import patterns
+from django.conf.urls import url
 from ietf.person import views, ajax
 
-urlpatterns = patterns('',
-        (r'^search/(?P<model_name>(person|email))/$', "ietf.person.views.ajax_select2_search", None, 'ajax_select2_search_person_email'),
-        (r'^(?P<personid>[a-z0-9]+).json$', ajax.person_json),
-        (ur'^(?P<email_or_name>[-\w\s\']+)', views.profile),
-)
+urlpatterns = [
+    url(r'^search/(?P<model_name>(person|email))/$', "ietf.person.views.ajax_select2_search", None, 'ajax_select2_search_person_email'),
+    url(r'^(?P<personid>[a-z0-9]+).json$', ajax.person_json),
+    url(ur'^(?P<email_or_name>[-\w\s\']+)', views.profile),
+]
diff --git a/ietf/redirects/urls.py b/ietf/redirects/urls.py
index db7095300..b6d64ad73 100644
--- a/ietf/redirects/urls.py
+++ b/ietf/redirects/urls.py
@@ -1,7 +1,7 @@
 # Copyright The IETF Trust 2007, All Rights Reserved
 
-from django.conf.urls import patterns
+from django.conf.urls import url
 
-urlpatterns = patterns('',
-     (r'^(?P<script>.*?\.cgi)(/.*)?$', 'ietf.redirects.views.redirect'),
-)
+urlpatterns = [
+    url(r'^(?P<script>.*?\.cgi)(/.*)?$', 'ietf.redirects.views.redirect'),
+]
diff --git a/ietf/release/urls.py b/ietf/release/urls.py
index 0f86ddad1..260c17235 100644
--- a/ietf/release/urls.py
+++ b/ietf/release/urls.py
@@ -1,11 +1,10 @@
-from django.conf.urls import patterns
+from django.conf.urls import url
 from django.views.generic import TemplateView
 
-urlpatterns = patterns('',
-    (r'^$',  'ietf.release.views.release'),
-    (r'^(?P<version>[0-9.]+.*)/$',  'ietf.release.views.release'),
-    (r'^about/?$',  TemplateView.as_view(template_name='release/about.html')),
-    (r'^todo/?$',  TemplateView.as_view(template_name='release/todo.html')),
-
-)
+urlpatterns = [
+    url(r'^$',  'ietf.release.views.release'),
+    url(r'^(?P<version>[0-9.]+.*)/$',  'ietf.release.views.release'),
+    url(r'^about/?$',  TemplateView.as_view(template_name='release/about.html')),
+    url(r'^todo/?$',  TemplateView.as_view(template_name='release/todo.html')),
+]
 
diff --git a/ietf/secr/announcement/urls.py b/ietf/secr/announcement/urls.py
index 4a318e1c9..76d864f66 100644
--- a/ietf/secr/announcement/urls.py
+++ b/ietf/secr/announcement/urls.py
@@ -1,6 +1,6 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.secr.announcement.views',
-    url(r'^$', 'main', name='announcement'),
-    url(r'^confirm/$', 'confirm', name='announcement_confirm'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.announcement.views.main', name='announcement'),
+    url(r'^confirm/$', 'ietf.secr.announcement.views.confirm', name='announcement_confirm'),
+]
diff --git a/ietf/secr/areas/urls.py b/ietf/secr/areas/urls.py
index 8ce16bd5a..63c7630ba 100644
--- a/ietf/secr/areas/urls.py
+++ b/ietf/secr/areas/urls.py
@@ -1,12 +1,12 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.secr.areas.views',
-    url(r'^$', 'list_areas', name='areas'),
-    url(r'^add/$', 'add', name='areas_add'),
-    url(r'^getemails', 'getemails', name='areas_emails'),
-    url(r'^getpeople', 'getpeople', name='areas_getpeople'),
-    url(r'^(?P<name>[A-Za-z0-9.-]+)/$', 'view', name='areas_view'),
-    url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/$', 'edit', name='areas_edit'),
-    url(r'^(?P<name>[A-Za-z0-9.-]+)/people/$', 'people', name='areas_people'),
-    url(r'^(?P<name>[A-Za-z0-9.-]+)/people/modify/$', 'modify', name='areas_modify'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.areas.views.list_areas', name='areas'),
+    url(r'^add/$', 'ietf.secr.areas.views.add', name='areas_add'),
+    url(r'^getemails', 'ietf.secr.areas.views.getemails', name='areas_emails'),
+    url(r'^getpeople', 'ietf.secr.areas.views.getpeople', name='areas_getpeople'),
+    url(r'^(?P<name>[A-Za-z0-9.-]+)/$', 'ietf.secr.areas.views.view', name='areas_view'),
+    url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/$', 'ietf.secr.areas.views.edit', name='areas_edit'),
+    url(r'^(?P<name>[A-Za-z0-9.-]+)/people/$', 'ietf.secr.areas.views.people', name='areas_people'),
+    url(r'^(?P<name>[A-Za-z0-9.-]+)/people/modify/$', 'ietf.secr.areas.views.modify', name='areas_modify'),
+]
diff --git a/ietf/secr/console/urls.py b/ietf/secr/console/urls.py
index 45ef330e1..776755f48 100644
--- a/ietf/secr/console/urls.py
+++ b/ietf/secr/console/urls.py
@@ -1,5 +1,5 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.secr.console.views',
-    url(r'^$', 'main', name='console'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.console.views.main', name='console'),
+]
diff --git a/ietf/secr/drafts/urls.py b/ietf/secr/drafts/urls.py
index 8aac93583..7031b032a 100644
--- a/ietf/secr/drafts/urls.py
+++ b/ietf/secr/drafts/urls.py
@@ -1,25 +1,24 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.secr.drafts.views',
-    url(r'^$', 'search', name='drafts'),
-    url(r'^add/$', 'add', name='drafts_add'),
-    url(r'^approvals/$', 'approvals', name='drafts_approvals'),
-    url(r'^dates/$', 'dates', name='drafts_dates'),
-    url(r'^nudge-report/$', 'nudge_report', name='drafts_nudge_report'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/$', 'view', name='drafts_view'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/abstract/$', 'abstract', name='drafts_abstract'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/announce/$', 'announce', name='drafts_announce'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/authors/$', 'authors', name='drafts_authors'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/author_delete/(?P<oid>\d{1,6})$',
-        'author_delete', name='drafts_author_delete'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/confirm/$', 'confirm', name='drafts_confirm'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/edit/$', 'edit', name='drafts_edit'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/extend/$', 'extend', name='drafts_extend'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/email/$', 'email', name='drafts_email'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/makerfc/$', 'makerfc', name='drafts_makerfc'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/replace/$', 'replace', name='drafts_replace'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/resurrect/$', 'resurrect', name='drafts_resurrect'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/revision/$', 'revision', name='drafts_revision'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/update/$', 'update', name='drafts_update'),
-    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/withdraw/$', 'withdraw', name='drafts_withdraw'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.drafts.views.search', name='drafts'),
+    url(r'^add/$', 'ietf.secr.drafts.views.add', name='drafts_add'),
+    url(r'^approvals/$', 'ietf.secr.drafts.views.approvals', name='drafts_approvals'),
+    url(r'^dates/$', 'ietf.secr.drafts.views.dates', name='drafts_dates'),
+    url(r'^nudge-report/$', 'ietf.secr.drafts.views.nudge_report', name='drafts_nudge_report'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/$', 'ietf.secr.drafts.views.view', name='drafts_view'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/abstract/$', 'ietf.secr.drafts.views.abstract', name='drafts_abstract'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/announce/$', 'ietf.secr.drafts.views.announce', name='drafts_announce'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/authors/$', 'ietf.secr.drafts.views.authors', name='drafts_authors'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/author_delete/(?P<oid>\d{1,6})$', 'ietf.secr.drafts.views.author_delete', name='drafts_author_delete'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/confirm/$', 'ietf.secr.drafts.views.confirm', name='drafts_confirm'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/edit/$', 'ietf.secr.drafts.views.edit', name='drafts_edit'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/extend/$', 'ietf.secr.drafts.views.extend', name='drafts_extend'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/email/$', 'ietf.secr.drafts.views.email', name='drafts_email'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/makerfc/$', 'ietf.secr.drafts.views.makerfc', name='drafts_makerfc'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/replace/$', 'ietf.secr.drafts.views.replace', name='drafts_replace'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/resurrect/$', 'ietf.secr.drafts.views.resurrect', name='drafts_resurrect'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/revision/$', 'ietf.secr.drafts.views.revision', name='drafts_revision'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/update/$', 'ietf.secr.drafts.views.update', name='drafts_update'),
+    url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/withdraw/$', 'ietf.secr.drafts.views.withdraw', name='drafts_withdraw'),
+]
\ No newline at end of file
diff --git a/ietf/secr/groups/urls.py b/ietf/secr/groups/urls.py
index 5c77571a7..d5914f90a 100644
--- a/ietf/secr/groups/urls.py
+++ b/ietf/secr/groups/urls.py
@@ -1,17 +1,17 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.conf import settings
 
-urlpatterns = patterns('ietf.secr.groups.views',
-    url(r'^$', 'search', name='groups'),
-    url(r'^add/$', 'add', name='groups_add'),
-    url(r'^blue-dot-report/$', 'blue_dot', name='groups_blue_dot'),
-    url(r'^search/$', 'search', name='groups_search'),
-    #(r'^ajax/get_ads/$', 'get_ads'),
-    url(r'^%(acronym)s/$' % settings.URL_REGEXPS, 'view', name='groups_view'),
-    url(r'^%(acronym)s/delete/(?P<id>\d{1,6})/$' % settings.URL_REGEXPS, 'delete_role', name='groups_delete_role'),
-    url(r'^%(acronym)s/charter/$' % settings.URL_REGEXPS, 'charter', name='groups_charter'),
-    url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, 'edit', name='groups_edit'),
-    url(r'^%(acronym)s/gm/$' % settings.URL_REGEXPS, 'view_gm', name='groups_view_gm'),
-    url(r'^%(acronym)s/gm/edit/$' % settings.URL_REGEXPS, 'edit_gm', name='groups_edit_gm'),
-    url(r'^%(acronym)s/people/$' % settings.URL_REGEXPS, 'people', name='groups_people'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.groups.views.search', name='groups'),
+    url(r'^add/$', 'ietf.secr.groups.views.add', name='groups_add'),
+    url(r'^blue-dot-report/$', 'ietf.secr.groups.views.blue_dot', name='groups_blue_dot'),
+    url(r'^search/$', 'ietf.secr.groups.views.search', name='groups_search'),
+    #(r'^ajax/get_ads/$', 'ietf.secr.groups.views.get_ads'),
+    url(r'^%(acronym)s/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.view', name='groups_view'),
+    url(r'^%(acronym)s/delete/(?P<id>\d{1,6})/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.delete_role', name='groups_delete_role'),
+    url(r'^%(acronym)s/charter/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.charter', name='groups_charter'),
+    url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.edit', name='groups_edit'),
+    url(r'^%(acronym)s/gm/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.view_gm', name='groups_view_gm'),
+    url(r'^%(acronym)s/gm/edit/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.edit_gm', name='groups_edit_gm'),
+    url(r'^%(acronym)s/people/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.people', name='groups_people'),
+]
diff --git a/ietf/secr/meetings/urls.py b/ietf/secr/meetings/urls.py
index ad0ad399c..c42ca0c47 100644
--- a/ietf/secr/meetings/urls.py
+++ b/ietf/secr/meetings/urls.py
@@ -1,25 +1,25 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.secr.meetings.views',
-    url(r'^$', 'main', name='meetings'),
-    url(r'^add/$', 'add', name='meetings_add'),
-    url(r'^ajax/get-times/(?P<meeting_id>\d{1,6})/(?P<day>\d)/$', 'ajax_get_times', name='meetings_ajax_get_times'),
-    url(r'^blue_sheet/$', 'blue_sheet_redirect', name='meetings_blue_sheet_redirect'),
-    url(r'^(?P<meeting_id>\d{1,6})/$', 'view', name='meetings_view'),
-    url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/$', 'blue_sheet', name='meetings_blue_sheet'),
-    url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/generate/$', 'blue_sheet_generate', name='meetings_blue_sheet_generate'),
-    url(r'^(?P<meeting_id>\d{1,6})/edit/$', 'edit_meeting', name='meetings_edit_meeting'),
-    url(r'^(?P<meeting_id>\d{1,6})/notifications/$', 'notifications', name='meetings_notifications'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/$', 'select', name='meetings_select'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/$', 'non_session', name='meetings_non_session'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/edit/(?P<slot_id>\d{1,6})/$', 'non_session_edit', name='meetings_non_session_edit'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/delete/(?P<slot_id>\d{1,6})/$', 'non_session_delete', name='meetings_non_session_delete'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/rooms/$', 'rooms', name='meetings_rooms'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/select/$', 'select_group', name='meetings_select_group'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/$', 'times', name='meetings_times'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/delete/(?P<time>[0-9\:]+)/$', 'times_delete', name='meetings_times_delete'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', 'times_edit', name='meetings_times_edit'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/unschedule/(?P<session_id>\d{1,6})/$', 'unschedule', name='meetings_unschedule'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<acronym>[-a-z0-9]+)/schedule/$', 'schedule', name='meetings_schedule'),
-    url(r'^(?P<meeting_id>\d{1,6})/(?P<acronym>[-a-z0-9]+)/remove/$', 'remove_session', name='meetings_remove_session'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.meetings.views.main', name='meetings'),
+    url(r'^add/$', 'ietf.secr.meetings.views.add', name='meetings_add'),
+    url(r'^ajax/get-times/(?P<meeting_id>\d{1,6})/(?P<day>\d)/$', 'ietf.secr.meetings.views.ajax_get_times', name='meetings_ajax_get_times'),
+    url(r'^blue_sheet/$', 'ietf.secr.meetings.views.blue_sheet_redirect', name='meetings_blue_sheet_redirect'),
+    url(r'^(?P<meeting_id>\d{1,6})/$', 'ietf.secr.meetings.views.view', name='meetings_view'),
+    url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/$', 'ietf.secr.meetings.views.blue_sheet', name='meetings_blue_sheet'),
+    url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/generate/$', 'ietf.secr.meetings.views.blue_sheet_generate', name='meetings_blue_sheet_generate'),
+    url(r'^(?P<meeting_id>\d{1,6})/edit/$', 'ietf.secr.meetings.views.edit_meeting', name='meetings_edit_meeting'),
+    url(r'^(?P<meeting_id>\d{1,6})/notifications/$', 'ietf.secr.meetings.views.notifications', name='meetings_notifications'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/$', 'ietf.secr.meetings.views.select', name='meetings_select'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/$', 'ietf.secr.meetings.views.non_session', name='meetings_non_session'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/edit/(?P<slot_id>\d{1,6})/$', 'ietf.secr.meetings.views.non_session_edit', name='meetings_non_session_edit'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/delete/(?P<slot_id>\d{1,6})/$', 'ietf.secr.meetings.views.non_session_delete', name='meetings_non_session_delete'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/rooms/$', 'ietf.secr.meetings.views.rooms', name='meetings_rooms'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/select/$', 'ietf.secr.meetings.views.select_group', name='meetings_select_group'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/$', 'ietf.secr.meetings.views.times', name='meetings_times'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/delete/(?P<time>[0-9\:]+)/$', 'ietf.secr.meetings.views.times_delete', name='meetings_times_delete'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', 'ietf.secr.meetings.views.times_edit', name='meetings_times_edit'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/unschedule/(?P<session_id>\d{1,6})/$', 'ietf.secr.meetings.views.unschedule', name='meetings_unschedule'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<acronym>[-a-z0-9]+)/schedule/$', 'ietf.secr.meetings.views.schedule', name='meetings_schedule'),
+    url(r'^(?P<meeting_id>\d{1,6})/(?P<acronym>[-a-z0-9]+)/remove/$', 'ietf.secr.meetings.views.remove_session', name='meetings_remove_session'),
+]
diff --git a/ietf/secr/proceedings/urls.py b/ietf/secr/proceedings/urls.py
index 25705cea1..03c1623b6 100644
--- a/ietf/secr/proceedings/urls.py
+++ b/ietf/secr/proceedings/urls.py
@@ -1,16 +1,16 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.conf import settings
 from ietf.meeting.views import OldUploadRedirect
 
-urlpatterns = patterns('ietf.secr.proceedings.views',
-    url(r'^$', 'main', name='proceedings'),
-    url(r'^ajax/generate-proceedings/(?P<meeting_num>\d{1,3})/$', 'ajax_generate_proceedings', name='proceedings_ajax_generate_proceedings'),
+urlpatterns = [
+    url(r'^$', 'ietf.secr.proceedings.views.main', name='proceedings'),
+    url(r'^ajax/generate-proceedings/(?P<meeting_num>\d{1,3})/$', 'ietf.secr.proceedings.views.ajax_generate_proceedings', name='proceedings_ajax_generate_proceedings'),
     # special offline URL for testing proceedings build
-    url(r'^process-pdfs/(?P<meeting_num>\d{1,3})/$', 'process_pdfs', name='proceedings_process_pdfs'),
-    url(r'^progress-report/(?P<meeting_num>\d{1,3})/$', 'progress_report', name='proceedings_progress_report'),
-    url(r'^(?P<meeting_num>\d{1,3})/$', 'select', name='proceedings_select'),
-    url(r'^(?P<meeting_num>\d{1,3})/recording/$', 'recording', name='proceedings_recording'),
-    url(r'^(?P<meeting_num>\d{1,3})/recording/edit/(?P<name>[A-Za-z0-9_\-\+]+)$', 'recording_edit', name='proceedings_recording_edit'),
+    url(r'^process-pdfs/(?P<meeting_num>\d{1,3})/$', 'ietf.secr.proceedings.views.process_pdfs', name='proceedings_process_pdfs'),
+    url(r'^progress-report/(?P<meeting_num>\d{1,3})/$', 'ietf.secr.proceedings.views.progress_report', name='proceedings_progress_report'),
+    url(r'^(?P<meeting_num>\d{1,3})/$', 'ietf.secr.proceedings.views.select', name='proceedings_select'),
+    url(r'^(?P<meeting_num>\d{1,3})/recording/$', 'ietf.secr.proceedings.views.recording', name='proceedings_recording'),
+    url(r'^(?P<meeting_num>\d{1,3})/recording/edit/(?P<name>[A-Za-z0-9_\-\+]+)$', 'ietf.secr.proceedings.views.recording_edit', name='proceedings_recording_edit'),
     url(r'^(?P<num>\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/%(acronym)s/$' % settings.URL_REGEXPS,
          OldUploadRedirect.as_view(permanent=True)),
-)
+]
diff --git a/ietf/secr/roles/urls.py b/ietf/secr/roles/urls.py
index 6a2d566a0..c0ca352f2 100644
--- a/ietf/secr/roles/urls.py
+++ b/ietf/secr/roles/urls.py
@@ -1,8 +1,8 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.conf import settings
 
-urlpatterns = patterns('ietf.secr.roles.views',
-    url(r'^$', 'main', name='roles'),
-    url(r'^ajax/get-roles/%(acronym)s/$' % settings.URL_REGEXPS, 'ajax_get_roles', name='roles_ajax_get_roles'),
-    url(r'^%(acronym)s/delete/(?P<id>\d{1,6})/$' % settings.URL_REGEXPS, 'delete_role', name='roles_delete_role'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.roles.views.main', name='roles'),
+    url(r'^ajax/get-roles/%(acronym)s/$' % settings.URL_REGEXPS, 'ietf.secr.roles.views.ajax_get_roles', name='roles_ajax_get_roles'),
+    url(r'^%(acronym)s/delete/(?P<id>\d{1,6})/$' % settings.URL_REGEXPS, 'ietf.secr.roles.views.delete_role', name='roles_delete_role'),
+]
diff --git a/ietf/secr/rolodex/urls.py b/ietf/secr/rolodex/urls.py
index dcf7d6778..7c3a7ba37 100644
--- a/ietf/secr/rolodex/urls.py
+++ b/ietf/secr/rolodex/urls.py
@@ -1,10 +1,10 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.secr.rolodex.views',
-    url(r'^$', 'search', name='rolodex'),
-    url(r'^add/$', 'add', name='rolodex_add'),
-    url(r'^add-proceed/$', 'add_proceed', name='rolodex_add_proceed'),
-    url(r'^(?P<id>\d{1,6})/edit/$', 'edit', name='rolodex_edit'),
-    #url(r'^(?P<id>\d{1,6})/delete/$', 'delete', name='rolodex_delete'),
-    url(r'^(?P<id>\d{1,6})/$', 'view', name='rolodex_view'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.rolodex.views.search', name='rolodex'),
+    url(r'^add/$', 'ietf.secr.rolodex.views.add', name='rolodex_add'),
+    url(r'^add-proceed/$', 'ietf.secr.rolodex.views.add_proceed', name='rolodex_add_proceed'),
+    url(r'^(?P<id>\d{1,6})/edit/$', 'ietf.secr.rolodex.views.edit', name='rolodex_edit'),
+    #url(r'^(?P<id>\d{1,6})/delete/$', 'ietf.secr.rolodex.views.delete', name='rolodex_delete'),
+    url(r'^(?P<id>\d{1,6})/$', 'ietf.secr.rolodex.views.view', name='rolodex_view'),
+]
diff --git a/ietf/secr/sreq/urls.py b/ietf/secr/sreq/urls.py
index 5e79a9199..f42ea6cc5 100644
--- a/ietf/secr/sreq/urls.py
+++ b/ietf/secr/sreq/urls.py
@@ -1,16 +1,16 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.conf import settings
 
-urlpatterns = patterns('ietf.secr.sreq.views',
-    url(r'^$', 'main', name='sessions'),
-    url(r'^status/$', 'tool_status', name='sessions_tool_status'),
-    url(r'^%(acronym)s/$' % settings.URL_REGEXPS, 'view', name='sessions_view'),
-    url(r'^(?P<num>[A-Za-z0-9_\-\+]+)/%(acronym)s/view/$' % settings.URL_REGEXPS, 'view', name='sessions_view'),
-    url(r'^%(acronym)s/approve/$' % settings.URL_REGEXPS, 'approve', name='sessions_approve'),
-    url(r'^%(acronym)s/cancel/$' % settings.URL_REGEXPS, 'cancel', name='sessions_cancel'),
-    url(r'^%(acronym)s/confirm/$' % settings.URL_REGEXPS, 'confirm', name='sessions_confirm'),
-    url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, 'edit', name='sessions_edit'),
-    url(r'^%(acronym)s/new/$' % settings.URL_REGEXPS, 'new', name='sessions_new'),
-    url(r'^%(acronym)s/no_session/$' % settings.URL_REGEXPS, 'no_session', name='sessions_no_session'),
-    url(r'^(?P<num>[A-Za-z0-9_\-\+]+)/%(acronym)s/edit/$' % settings.URL_REGEXPS, 'edit_mtg', name='sessions_edit'),
-)
+urlpatterns = [
+    url(r'^$', 'ietf.secr.sreq.views.main', name='sessions'),
+    url(r'^status/$', 'ietf.secr.sreq.views.tool_status', name='sessions_tool_status'),
+    url(r'^%(acronym)s/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.view', name='sessions_view'),
+    url(r'^(?P<num>[A-Za-z0-9_\-\+]+)/%(acronym)s/view/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.view', name='sessions_view'),
+    url(r'^%(acronym)s/approve/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.approve', name='sessions_approve'),
+    url(r'^%(acronym)s/cancel/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.cancel', name='sessions_cancel'),
+    url(r'^%(acronym)s/confirm/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.confirm', name='sessions_confirm'),
+    url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.edit', name='sessions_edit'),
+    url(r'^%(acronym)s/new/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.new', name='sessions_new'),
+    url(r'^%(acronym)s/no_session/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.no_session', name='sessions_no_session'),
+    url(r'^(?P<num>[A-Za-z0-9_\-\+]+)/%(acronym)s/edit/$' % settings.URL_REGEXPS, 'ietf.secr.sreq.views.edit_mtg', name='sessions_edit'),
+]
diff --git a/ietf/secr/telechat/urls.py b/ietf/secr/telechat/urls.py
index 5516a010e..d9295bbd9 100644
--- a/ietf/secr/telechat/urls.py
+++ b/ietf/secr/telechat/urls.py
@@ -1,14 +1,14 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('ietf.secr.telechat.views',
-    url(r'^$', 'main', name='telechat'),
-    url(r'^(?P<date>[0-9\-]+)/bash/$', 'bash', name='telechat_bash'),
-    url(r'^(?P<date>[0-9\-]+)/doc/$', 'doc', name='telechat_doc'),
-    url(r'^(?P<date>[0-9\-]+)/doc/(?P<name>[A-Za-z0-9.-]+)/$', 'doc_detail', name='telechat_doc_detail'),
-    url(r'^(?P<date>[0-9\-]+)/doc/(?P<name>[A-Za-z0-9.-]+)/(?P<nav>next|previous)/$', 'doc_navigate',
+urlpatterns = [
+    url(r'^$', 'ietf.secr.telechat.views.main', name='telechat'),
+    url(r'^(?P<date>[0-9\-]+)/bash/$', 'ietf.secr.telechat.views.bash', name='telechat_bash'),
+    url(r'^(?P<date>[0-9\-]+)/doc/$', 'ietf.secr.telechat.views.doc', name='telechat_doc'),
+    url(r'^(?P<date>[0-9\-]+)/doc/(?P<name>[A-Za-z0-9.-]+)/$', 'ietf.secr.telechat.views.doc_detail', name='telechat_doc_detail'),
+    url(r'^(?P<date>[0-9\-]+)/doc/(?P<name>[A-Za-z0-9.-]+)/(?P<nav>next|previous)/$', 'ietf.secr.telechat.views.doc_navigate',
         name='telechat_doc_navigate'),
-    url(r'^(?P<date>[0-9\-]+)/management/$', 'management', name='telechat_management'),
-    url(r'^(?P<date>[0-9\-]+)/minutes/$', 'minutes', name='telechat_minutes'),
-    url(r'^(?P<date>[0-9\-]+)/roll-call/$', 'roll_call', name='telechat_roll_call'),
-    url(r'^new/$', 'new', name='telechat_new'),
-)
+    url(r'^(?P<date>[0-9\-]+)/management/$', 'ietf.secr.telechat.views.management', name='telechat_management'),
+    url(r'^(?P<date>[0-9\-]+)/minutes/$', 'ietf.secr.telechat.views.minutes', name='telechat_minutes'),
+    url(r'^(?P<date>[0-9\-]+)/roll-call/$', 'ietf.secr.telechat.views.roll_call', name='telechat_roll_call'),
+    url(r'^new/$', 'ietf.secr.telechat.views.new', name='telechat_new'),
+]
diff --git a/ietf/secr/urls.py b/ietf/secr/urls.py
index ca3772764..1cb0bfba8 100644
--- a/ietf/secr/urls.py
+++ b/ietf/secr/urls.py
@@ -1,17 +1,17 @@
-from django.conf.urls import patterns, url, include
+from django.conf.urls import url, include
 from django.views.generic import TemplateView
 
-urlpatterns = patterns('',
+urlpatterns = [
     url(r'^$', TemplateView.as_view(template_name='main.html'), name="home"),
-    (r'^announcement/', include('ietf.secr.announcement.urls')),
-    (r'^areas/', include('ietf.secr.areas.urls')),
-    (r'^console/', include('ietf.secr.console.urls')),
-    (r'^drafts/', include('ietf.secr.drafts.urls')),
-    (r'^groups/', include('ietf.secr.groups.urls')),
-    (r'^meetings/', include('ietf.secr.meetings.urls')),
-    (r'^proceedings/', include('ietf.secr.proceedings.urls')),
-    (r'^roles/', include('ietf.secr.roles.urls')),
-    (r'^rolodex/', include('ietf.secr.rolodex.urls')),
-    (r'^sreq/', include('ietf.secr.sreq.urls')),
-    (r'^telechat/', include('ietf.secr.telechat.urls')),
-)
+    url(r'^announcement/', include('ietf.secr.announcement.urls')),
+    url(r'^areas/', include('ietf.secr.areas.urls')),
+    url(r'^console/', include('ietf.secr.console.urls')),
+    url(r'^drafts/', include('ietf.secr.drafts.urls')),
+    url(r'^groups/', include('ietf.secr.groups.urls')),
+    url(r'^meetings/', include('ietf.secr.meetings.urls')),
+    url(r'^proceedings/', include('ietf.secr.proceedings.urls')),
+    url(r'^roles/', include('ietf.secr.roles.urls')),
+    url(r'^rolodex/', include('ietf.secr.rolodex.urls')),
+    url(r'^sreq/', include('ietf.secr.sreq.urls')),
+    url(r'^telechat/', include('ietf.secr.telechat.urls')),
+]
\ No newline at end of file
diff --git a/ietf/settings.py b/ietf/settings.py
index 8a6e64726..6fd1c2b94 100644
--- a/ietf/settings.py
+++ b/ietf/settings.py
@@ -13,6 +13,8 @@ warnings.simplefilter("always", DeprecationWarning)
 warnings.filterwarnings("ignore", message="Report.file_reporters will no longer be available in Coverage.py 4.2", module="coverage.report")
 warnings.filterwarnings("ignore", message="initial_data fixtures are deprecated. Use data migrations instead.", module="django.core.management.commands.loaddata")
 warnings.filterwarnings("ignore", message="The popen2 module is deprecated.  Use the subprocess module.", module="ietf.utils.pipe")
+warnings.filterwarnings("ignore", message="Reversing by dotted path is deprecated")
+warnings.filterwarnings("ignore", message=r"Support for string view arguments to url\(\) is deprecated and will be removed in Django 1.10")
 
 try:
     import syslog
diff --git a/ietf/settings_sqlitetest.py b/ietf/settings_sqlitetest.py
index 5a9a10e31..149d896c6 100644
--- a/ietf/settings_sqlitetest.py
+++ b/ietf/settings_sqlitetest.py
@@ -17,13 +17,13 @@ debug.debug = True
 
 ## To be removed after upgrade to Django 1.8 ##
 
-from django.db.migrations.loader import MIGRATIONS_MODULE_NAME
 class DisableMigrations(object):
  
     def __contains__(self, item):
         return True
  
     def __getitem__(self, item):
+        from django.db.migrations.loader import MIGRATIONS_MODULE_NAME
         # The string below is significant.  It has to include the value of
         # django.db.migrations.loader.MIGRATIONS_MODULE_NAME.  Used by django
         # 1.7 code in django.db.migrations.loader.MigrationLoader to
diff --git a/ietf/stats/urls.py b/ietf/stats/urls.py
index 8a05f9659..9f9979a3e 100644
--- a/ietf/stats/urls.py
+++ b/ietf/stats/urls.py
@@ -1,9 +1,9 @@
-from django.conf.urls import patterns, url
 from django.conf import settings
 
 import ietf.stats.views
+from ietf.utils.urls  import url
 
-urlpatterns = patterns('',
+urlpatterns = [
     url("^$", ietf.stats.views.stats_index),
     url("^review/(?:(?P<stats_type>completion|results|states|time)/)?(?:%(acronym)s/)?$" % settings.URL_REGEXPS, ietf.stats.views.review_stats),
-)
+]
diff --git a/ietf/submit/urls.py b/ietf/submit/urls.py
index b1c8a79ff..86f4dd43f 100644
--- a/ietf/submit/urls.py
+++ b/ietf/submit/urls.py
@@ -1,29 +1,29 @@
-from django.conf.urls import patterns
+from django.conf.urls import url
 
 from ietf.submit import views
 
-urlpatterns = patterns('ietf.submit.views',
-    (r'^$', views.upload_submission),
-    (r'^status/$', views.search_submission),
-    (r'^status/(?P<submission_id>\d+)/$', views.submission_status),
-    (r'^status/(?P<submission_id>\d+)/(?P<access_token>[a-f\d]*)/$', views.submission_status),
-    (r'^status/(?P<submission_id>\d+)/confirm/(?P<auth_token>[a-f\d]+)/$', views.confirm_submission),
-    (r'^status/(?P<submission_id>\d+)/edit/$', views.edit_submission),
-    (r'^status/(?P<submission_id>\d+)/(?P<access_token>[a-f\d]+)/edit/$', views.edit_submission),
-    (r'^note-well/$', views.note_well),
-    (r'^tool-instructions/$', views.tool_instructions),
+urlpatterns = [ 
+    url(r'^$', views.upload_submission),
+    url(r'^status/$', views.search_submission),
+    url(r'^status/(?P<submission_id>\d+)/$', views.submission_status),
+    url(r'^status/(?P<submission_id>\d+)/(?P<access_token>[a-f\d]*)/$', views.submission_status),
+    url(r'^status/(?P<submission_id>\d+)/confirm/(?P<auth_token>[a-f\d]+)/$', views.confirm_submission),
+    url(r'^status/(?P<submission_id>\d+)/edit/$', views.edit_submission),
+    url(r'^status/(?P<submission_id>\d+)/(?P<access_token>[a-f\d]+)/edit/$', views.edit_submission),
+    url(r'^note-well/$', views.note_well),
+    url(r'^tool-instructions/$', views.tool_instructions),
 
-    (r'^approvals/$', views.approvals),
-    (r'^approvals/addpreapproval/$', views.add_preapproval),
-    (r'^approvals/cancelpreapproval/(?P<preapproval_id>[a-f\d]+)/$', views.cancel_preapproval),
+    url(r'^approvals/$', views.approvals),
+    url(r'^approvals/addpreapproval/$', views.add_preapproval),
+    url(r'^approvals/cancelpreapproval/(?P<preapproval_id>[a-f\d]+)/$', views.cancel_preapproval),
 
-    (r'^manualpost/$', views.manualpost),
-    (r'^manualpost/addemail$', views.add_manualpost_email),
-    (r'^manualpost/addemail/(?P<submission_id>\d+)/(?P<access_token>[a-f\d]*)/$', views.add_manualpost_email),
-    (r'^manualpost/attachment/(?P<submission_id>\d+)/(?P<message_id>\d+)/(?P<filename>.*)$', views.show_submission_email_attachment),
-    (r'^manualpost/cancel$', views.cancel_waiting_for_draft),
-    (r'^manualpost/email/(?P<submission_id>\d+)/(?P<message_id>\d+)/$', views.show_submission_email_message),
-    (r'^manualpost/email/(?P<submission_id>\d+)/(?P<message_id>\d+)/(?P<access_token>[a-f\d]*)/$', views.show_submission_email_message),
-    (r'^manualpost/replyemail/(?P<submission_id>\d+)/(?P<message_id>\d+)/$', views.send_submission_email),
-    (r'^manualpost/sendemail/(?P<submission_id>\d+)/$', views.send_submission_email),
-)
+    url(r'^manualpost/$', views.manualpost),
+    url(r'^manualpost/addemail$', views.add_manualpost_email),
+    url(r'^manualpost/addemail/(?P<submission_id>\d+)/(?P<access_token>[a-f\d]*)/$', views.add_manualpost_email),
+    url(r'^manualpost/attachment/(?P<submission_id>\d+)/(?P<message_id>\d+)/(?P<filename>.*)$', views.show_submission_email_attachment),
+    url(r'^manualpost/cancel$', views.cancel_waiting_for_draft),
+    url(r'^manualpost/email/(?P<submission_id>\d+)/(?P<message_id>\d+)/$', views.show_submission_email_message),
+    url(r'^manualpost/email/(?P<submission_id>\d+)/(?P<message_id>\d+)/(?P<access_token>[a-f\d]*)/$', views.show_submission_email_message),
+    url(r'^manualpost/replyemail/(?P<submission_id>\d+)/(?P<message_id>\d+)/$', views.send_submission_email),
+    url(r'^manualpost/sendemail/(?P<submission_id>\d+)/$', views.send_submission_email),
+]
diff --git a/ietf/sync/urls.py b/ietf/sync/urls.py
index 31a37833d..e1a095f55 100644
--- a/ietf/sync/urls.py
+++ b/ietf/sync/urls.py
@@ -1,8 +1,8 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('',
+urlpatterns = [
     url(r'^discrepancies/$', 'ietf.sync.views.discrepancies'),
     url(r'^(?P<org>\w+)/notify/(?P<notification>\w+)/$', 'ietf.sync.views.notify'),
     url(r'^rfceditor/undo/', 'ietf.sync.views.rfceditor_undo')
-)
+]
 
diff --git a/ietf/urls.py b/ietf/urls.py
index 092f6ba63..4b5a468f4 100644
--- a/ietf/urls.py
+++ b/ietf/urls.py
@@ -1,7 +1,7 @@
 # Copyright The IETF Trust 2007, 2009, All Rights Reserved
 
 from django.conf import settings
-from django.conf.urls import patterns, include
+from django.conf.urls import include
 from django.conf.urls.static import static
 from django.contrib import admin
 from django.views.generic import TemplateView
@@ -9,8 +9,10 @@ from django.contrib.staticfiles.urls import staticfiles_urlpatterns
 
 import debug                            # pyflakes:ignore
 
+from ietf.doc import views_search
 from ietf.liaisons.sitemaps import LiaisonMap
 from ietf.ipr.sitemaps import IPRMap
+from ietf.utils.urls import url
 from ietf import api
 
 admin.autodiscover()
@@ -28,66 +30,66 @@ sitemaps = {
     'ipr': IPRMap,
 }
 
-urlpatterns = patterns('',
-    (r'^$', 'ietf.doc.views_search.frontpage'),
-    (r'^accounts/', include('ietf.ietfauth.urls')),
-    (r'^admin/', include(admin.site.urls)),
-    (r'^admin/docs/', include('django.contrib.admindocs.urls')),
-    (r'^ann/', include('ietf.nomcom.redirect_ann_urls')),
-    (r'^community/', include('ietf.community.urls')),
-    (r'^accounts/settings/', include('ietf.cookies.urls')),
-    (r'^doc/', include('ietf.doc.urls')),
-    (r'^drafts/', include('ietf.doc.redirect_drafts_urls')),
-    (r'^mailtrigger/',include('ietf.mailtrigger.urls')),
-    (r'^feed/', include('ietf.feed_urls')),
-    (r'^group/', include('ietf.group.urls')),
-    (r'^help/', include('ietf.help.urls')),
-    (r'^idtracker/', include('ietf.doc.redirect_idtracker_urls')),
-    (r'^iesg/', include('ietf.iesg.urls')),
-    (r'^ipr/', include('ietf.ipr.urls')),
-    (r'^liaison/', include('ietf.liaisons.urls')),
-    (r'^list/', include('ietf.mailinglists.urls')),
-    (r'^meeting/', include('ietf.meeting.urls')),
-    (r'^nomcom/', include('ietf.nomcom.urls')),
-    (r'^person/', include('ietf.person.urls')),
-    (r'^release/', include('ietf.release.urls')),
-    (r'^secr/', include('ietf.secr.urls')),
-    (r'^sitemap-(?P<section>.+).xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
-    (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', { 'sitemaps': sitemaps}),
-    (r'^stats/', include('ietf.stats.urls')),
-    (r'^stream/', include('ietf.group.urls_stream')),
-    (r'^submit/', include('ietf.submit.urls')),
-    (r'^sync/', include('ietf.sync.urls')),
-    (r'^templates/', include('ietf.dbtemplate.urls')),
-    (r'^(?P<group_type>(wg|rg|ag|team|dir|area))/', include('ietf.group.urls_info')),
+urlpatterns = [
+    url(r'^$', views_search.frontpage),
+    url(r'^accounts/', include('ietf.ietfauth.urls')),
+    url(r'^admin/', include(admin.site.urls)),
+    url(r'^admin/docs/', include('django.contrib.admindocs.urls')),
+    url(r'^ann/', include('ietf.nomcom.redirect_ann_urls')),
+    url(r'^community/', include('ietf.community.urls')),
+    url(r'^accounts/settings/', include('ietf.cookies.urls')),
+    url(r'^doc/', include('ietf.doc.urls')),
+    url(r'^drafts/', include('ietf.doc.redirect_drafts_urls')),
+    url(r'^mailtrigger/',include('ietf.mailtrigger.urls')),
+    url(r'^feed/', include('ietf.feed_urls')),
+    url(r'^group/', include('ietf.group.urls')),
+    url(r'^help/', include('ietf.help.urls')),
+    url(r'^idtracker/', include('ietf.doc.redirect_idtracker_urls')),
+    url(r'^iesg/', include('ietf.iesg.urls')),
+    url(r'^ipr/', include('ietf.ipr.urls')),
+    url(r'^liaison/', include('ietf.liaisons.urls')),
+    url(r'^list/', include('ietf.mailinglists.urls')),
+    url(r'^meeting/', include('ietf.meeting.urls')),
+    url(r'^nomcom/', include('ietf.nomcom.urls')),
+    url(r'^person/', include('ietf.person.urls')),
+    url(r'^release/', include('ietf.release.urls')),
+    url(r'^secr/', include('ietf.secr.urls')),
+    url(r'^sitemap-(?P<section>.+).xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
+    url(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', { 'sitemaps': sitemaps}),
+    url(r'^stats/', include('ietf.stats.urls')),
+    url(r'^stream/', include('ietf.group.urls_stream')),
+    url(r'^submit/', include('ietf.submit.urls')),
+    url(r'^sync/', include('ietf.sync.urls')),
+    url(r'^templates/', include('ietf.dbtemplate.urls')),
+    url(r'^(?P<group_type>(wg|rg|ag|team|dir|area))/', include('ietf.group.urls_info')),
 
     # Redirects
-    (r'^(?P<path>public)/', include('ietf.redirects.urls')),
+    url(r'^(?P<path>public)/', include('ietf.redirects.urls')),
 
     # Google webmaster tools verification url
-    (r'^googlea30ad1dacffb5e5b.html', TemplateView.as_view(template_name='googlea30ad1dacffb5e5b.html')),
-)
+    url(r'^googlea30ad1dacffb5e5b.html', TemplateView.as_view(template_name='googlea30ad1dacffb5e5b.html')),
+]
 
 # Endpoints for Tastypie's REST API
-urlpatterns += patterns('',
-    (r'^api/v1/?$', api.top_level),
-)
+urlpatterns += [
+    url(r'^api/v1/?$', api.top_level),
+]
 for n,a in api._api_list:
-    urlpatterns += patterns('',
-        (r'^api/v1/', include(a.urls)),
-    )
+    urlpatterns += [
+        url(r'^api/v1/', include(a.urls)),
+    ]
 
 # This is needed to serve files during testing
 if settings.SERVER_MODE in ('development', 'test'):
     save_debug = settings.DEBUG
     settings.DEBUG = True
     urlpatterns += staticfiles_urlpatterns()
-    urlpatterns += patterns('',
-            (r'^_test500/$', lambda x: None),
-            (r'^environment/$', 'ietf.help.views.environment'),
+    urlpatterns += [
+            url(r'^_test500/$', lambda x: None),
+            url(r'^environment/$', 'ietf.help.views.environment'),
             ## maybe preserve some static legacy URLs ?
-            (r'^(?P<path>(?:images|css|js)/.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT+'ietf/'}),
-        )
+            url(r'^(?P<path>(?:images|css|js)/.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT+'ietf/'}),
+        ]
     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
     settings.DEBUG = save_debug
 
diff --git a/ietf/utils/templatetags/textfilters.py b/ietf/utils/templatetags/textfilters.py
index 58a00bedb..1ee5e20c4 100644
--- a/ietf/utils/templatetags/textfilters.py
+++ b/ietf/utils/templatetags/textfilters.py
@@ -1,6 +1,6 @@
 from __future__ import unicode_literals
 
-from django.template.base import Library
+from django.template.library import Library
 from django.template.defaultfilters import stringfilter
 
 from ietf.utils.text import xslugify as _xslugify
diff --git a/ietf/utils/test_runner.py b/ietf/utils/test_runner.py
index 259bd10bc..7a81e2912 100644
--- a/ietf/utils/test_runner.py
+++ b/ietf/utils/test_runner.py
@@ -113,7 +113,7 @@ class TemplateCoverageLoader(BaseLoader):
         global template_coverage_collection, loaded_templates
         if template_coverage_collection == True:
             loaded_templates.add(str(template_name))
-        raise TemplateDoesNotExist
+        raise TemplateDoesNotExist(template_name)
     load_template_source.is_usable = True
 
 class RecordUrlsMiddleware(object):
diff --git a/ietf/utils/urls.py b/ietf/utils/urls.py
new file mode 100644
index 000000000..6fb5195b9
--- /dev/null
+++ b/ietf/utils/urls.py
@@ -0,0 +1,21 @@
+# Copyright The IETF Trust 2016, All Rights Reserved
+
+import six
+import debug                            # pyflakes:ignore
+
+from django.conf.urls import url as django_url
+
+#@debug.trace
+def url(regex, view, kwargs=None, name=None, prefix=''):
+    if isinstance(view, (list, tuple)):
+        pass                            # use the name passed in
+    elif isinstance(view, six.string_types):
+        name = view
+    elif callable(view):
+        name = "%s.%s" % (view.__module__, view.__name__)
+    else:
+        raise NotImplementedError("Auto-named url from view of type %s: %s" % (type(view), view))
+    if name:
+        debug.show('name')
+    return django_url(regex, view, kwargs=kwargs, name=name, prefix=prefix)
+    
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 16aba8935..e86c1e763 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,7 +7,7 @@ coverage>=4.0.1,!=4.0.2
 #cssselect>=0.6.1               # for PyQuery
 decorator>=3.4.0
 defusedxml>=0.4.1		# for TastyPie when ussing xml; not a declared dependency
-Django>=1.8.16,<1.9
+Django>=1.9,<1.10
 django-bootstrap3>=5.1.1,<7.0.0 # django-bootstrap 7.0 requires django 1.8
 django-formtools>=1.0		# instead of django.contrib.formtools in 1.8
 django-markup>=1.1
@@ -15,8 +15,7 @@ django-tastypie>=0.13.1
 django-widget-tweaks>=1.3
 docutils>=0.12                  
 factory-boy>=2.7.0
-# fake-factory==0.5.3		# from factory-boy
-Faker>=0.7.1			# Explicit install
+# Faker				# from factory-boy
 hashids>=1.1.0
 html5lib>=0.90,<0.99999999	# ietf.utils.html needs a rewrite for html5lib 1.x -- major code changes in sanitizer
 jsonfield>=1.0.3		# for SubmissionCheck.  This is https://github.com/bradjasper/django-jsonfield/.
@@ -26,7 +25,6 @@ mock>=2.0.0
 MySQL-python>=1.2.5
 pathlib>=1.0
 Pillow>=3.0
-pip>=6.1.1,<9.0
 pyang>=1.6
 pyflakes>=0.8.1
 pyquery>=1.2.13,!=1.2.14	# Pyqyery 1.2.14 fails on some selectors or stacked selectors