diff --git a/helios/election_url_names.py b/helios/election_url_names.py
new file mode 100644
index 0000000000000000000000000000000000000000..eff9a5ea232956f1e613bac9126dc51e2b3519ac
--- /dev/null
+++ b/helios/election_url_names.py
@@ -0,0 +1,62 @@
+ELECTION_HOME="election@home"
+ELECTION_VIEW="election@view"
+ELECTION_META="election@meta"
+ELECTION_EDIT="election@edit"
+ELECTION_SCHEDULE="election@schedule"
+ELECTION_EXTEND="election@extend"
+ELECTION_ARCHIVE="election@archive"
+ELECTION_COPY="election@copy"
+ELECTION_BADGE="election@badge"
+
+ELECTION_TRUSTEES_HOME="election@trustees"
+ELECTION_TRUSTEES_VIEW="election@trustees@view"
+ELECTION_TRUSTEES_NEW="election@trustees@new"
+ELECTION_TRUSTEES_ADD_HELIOS="election@trustees@add-helios"
+ELECTION_TRUSTEES_DELETE="election@trustees@delete"
+
+ELECTION_TRUSTEE_HOME="election@trustee"
+ELECTION_TRUSTEE_SEND_URL="election@trustee@send-url"
+ELECTION_TRUSTEE_KEY_GENERATOR="election@trustee@key-generator"
+ELECTION_TRUSTEE_CHECK_SK="election@trustee@check-sk"
+ELECTION_TRUSTEE_UPLOAD_PK="election@trustee@upload-pk"
+ELECTION_TRUSTEE_DECRYPT_AND_PROVE="election@trustee@decrypt-and-prove"
+ELECTION_TRUSTEE_UPLOAD_DECRYPTION="election@trustee@upload-decryption"
+
+ELECTION_RESULT="election@result"
+ELECTION_RESULT_PROOF="election@result@proof"
+ELECTION_BBOARD="election@bboard"
+ELECTION_AUDITED_BALLOTS="election@audited-ballots"
+
+ELECTION_GET_RANDOMNESS="election@get-randomness"
+ELECTION_ENCRYPT_BALLOT="election@encrypt-ballot"
+ELECTION_QUESTIONS="election@questions"
+ELECTION_SET_REG="election@set-reg"
+ELECTION_SET_FEATURED="election@set-featured"
+ELECTION_SAVE_QUESTIONS="election@save-questions"
+ELECTION_REGISTER="election@register"
+ELECTION_FREEZE="election@freeze"
+
+ELECTION_COMPUTE_TALLY="election@compute-tally"
+ELECTION_COMBINE_DECRYPTIONS="election@combine-decryptions"
+ELECTION_RELEASE_RESULT="election@release-result"
+
+ELECTION_CAST="election@cast"
+ELECTION_CAST_CONFIRM="election@cast-confirm"
+ELECTION_PASSWORD_VOTER_LOGIN="election@password-voter-login"
+ELECTION_CAST_DONE="election@cast-done"
+
+ELECTION_POST_AUDITED_BALLOT="election@post-audited-ballot"
+
+ELECTION_VOTERS_HOME="election@voters"
+ELECTION_VOTERS_UPLOAD="election@voters@upload"
+ELECTION_VOTERS_UPLOAD_CANCEL="election@voters@upload-cancel"
+ELECTION_VOTERS_LIST="election@voters@list"
+ELECTION_VOTERS_LIST_PRETTY="election@voters@list-pretty"
+ELECTION_VOTERS_ELIGIBILITY="election@voters@eligibility"
+ELECTION_VOTERS_EMAIL="election@voters@email"
+ELECTION_VOTER="election@voter"
+ELECTION_VOTER_DELETE="election@voter@delete"
+
+ELECTION_BALLOTS_LIST="election@ballots@list"
+ELECTION_BALLOTS_VOTER="election@ballots@voter"
+ELECTION_BALLOTS_VOTER_LAST="election@ballots@voter@last"
diff --git a/helios/election_urls.py b/helios/election_urls.py
index f7ed192a133c17edd76bfb1e3e6a560d8d2c0f5a..6fc07efaac9854557b8df6243b4ec1370fdd7a89 100644
--- a/helios/election_urls.py
+++ b/helios/election_urls.py
@@ -6,89 +6,97 @@ Ben Adida (ben@adida.net)
 
 from django.conf.urls import url
 
-from helios.views import *
+from helios import views
+from helios import election_url_names as names
 
 urlpatterns = [
     # election data that is cryptographically verified
-    url(r'^$', one_election),
+    url(r'^$', views.one_election, name=names.ELECTION_HOME),
 
     # metadata that need not be verified
-    url(r'^/meta$', one_election_meta),
+    url(r'^/meta$', views.one_election_meta, name=names.ELECTION_META),
     
     # edit election params
-    url(r'^/edit$', one_election_edit),
-    url(r'^/schedule$', one_election_schedule),
-    url(r'^/extend$', one_election_extend),
-    url(r'^/archive$', one_election_archive),
-    url(r'^/copy$', one_election_copy),
+    url(r'^/edit$', views.one_election_edit, name=names.ELECTION_EDIT),
+    url(r'^/schedule$', views.one_election_schedule, name=names.ELECTION_SCHEDULE),
+    url(r'^/extend$', views.one_election_extend, name=names.ELECTION_EXTEND),
+    url(r'^/archive$', views.one_election_archive, name=names.ELECTION_ARCHIVE),
+    url(r'^/copy$', views.one_election_copy, name=names.ELECTION_COPY),
 
     # badge
-    url(r'^/badge$', election_badge),
+    url(r'^/badge$', views.election_badge, name=names.ELECTION_BADGE),
 
     # adding trustees
-    url(r'^/trustees/$', list_trustees),
-    url(r'^/trustees/view$', list_trustees_view),
-    url(r'^/trustees/new$', new_trustee),
-    url(r'^/trustees/add-helios$', new_trustee_helios),
-    url(r'^/trustees/delete$', delete_trustee),
+    url(r'^/trustees/$', views.list_trustees, name=names.ELECTION_TRUSTEES_HOME),
+    url(r'^/trustees/view$', views.list_trustees_view, name=names.ELECTION_TRUSTEES_VIEW),
+    url(r'^/trustees/new$', views.new_trustee, name=names.ELECTION_TRUSTEES_NEW),
+    url(r'^/trustees/add-helios$', views.new_trustee_helios, name=names.ELECTION_TRUSTEES_ADD_HELIOS),
+    url(r'^/trustees/delete$', views.delete_trustee, name=names.ELECTION_TRUSTEES_DELETE),
     
     # trustee pages
-    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/home$', trustee_home),
-    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/sendurl$', trustee_send_url),
-    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/keygenerator$', trustee_keygenerator),
-    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/check-sk$', trustee_check_sk),
-    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/upoad-pk$', trustee_upload_pk),
-    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/decrypt-and-prove$', trustee_decrypt_and_prove),
-    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/upload-decryption$', trustee_upload_decryption),
+    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/home$',
+        views.trustee_home, name=names.ELECTION_TRUSTEE_HOME),
+    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/sendurl$',
+        views.trustee_send_url, name=names.ELECTION_TRUSTEE_SEND_URL),
+    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/keygenerator$',
+        views.trustee_keygenerator, name=names.ELECTION_TRUSTEE_KEY_GENERATOR),
+    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/check-sk$',
+        views.trustee_check_sk, name=names.ELECTION_TRUSTEE_CHECK_SK),
+    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/upoad-pk$',
+        views.trustee_upload_pk, name=names.ELECTION_TRUSTEE_UPLOAD_PK),
+    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/decrypt-and-prove$',
+        views.trustee_decrypt_and_prove, name=names.ELECTION_TRUSTEE_DECRYPT_AND_PROVE),
+    url(r'^/trustees/(?P<trustee_uuid>[^/]+)/upload-decryption$',
+        views.trustee_upload_decryption, name=names.ELECTION_TRUSTEE_UPLOAD_DECRYPTION),
     
     # election voting-process actions
-    url(r'^/view$', one_election_view),
-    url(r'^/result$', one_election_result),
-    url(r'^/result_proof$', one_election_result_proof),
-    # url(r'^/bboard$', one_election_bboard),
-    url(r'^/audited-ballots/$', one_election_audited_ballots),
+    url(r'^/view$', views.one_election_view, name=names.ELECTION_VIEW),
+    url(r'^/result$', views.one_election_result, name=names.ELECTION_RESULT),
+    url(r'^/result_proof$', views.one_election_result_proof, name=names.ELECTION_RESULT_PROOF),
+    # url(r'^/bboard$', views.one_election_bboard, name=names.ELECTION_BBOARD),
+    url(r'^/audited-ballots/$', views.one_election_audited_ballots, name=names.ELECTION_AUDITED_BALLOTS),
 
     # get randomness
-    url(r'^/get-randomness$', get_randomness),
+    url(r'^/get-randomness$', views.get_randomness, name=names.ELECTION_GET_RANDOMNESS),
 
     # server-side encryption
-    url(r'^/encrypt-ballot$', encrypt_ballot),
+    url(r'^/encrypt-ballot$', views.encrypt_ballot, name=names.ELECTION_ENCRYPT_BALLOT),
 
     # construct election
-    url(r'^/questions$', one_election_questions),
-    url(r'^/set_reg$', one_election_set_reg),
-    url(r'^/set_featured$', one_election_set_featured),
-    url(r'^/save_questions$', one_election_save_questions),
-    url(r'^/register$', one_election_register),
-    url(r'^/freeze$', one_election_freeze), # includes freeze_2 as POST target
+    url(r'^/questions$', views.one_election_questions, name=names.ELECTION_QUESTIONS),
+    url(r'^/set_reg$', views.one_election_set_reg, name=names.ELECTION_SET_REG),
+    url(r'^/set_featured$', views.one_election_set_featured, name=names.ELECTION_SET_FEATURED),
+    url(r'^/save_questions$', views.one_election_save_questions, name=names.ELECTION_SAVE_QUESTIONS),
+    url(r'^/register$', views.one_election_register, name=names.ELECTION_REGISTER),
+    url(r'^/freeze$', views.one_election_freeze, name=names.ELECTION_FREEZE), # includes freeze_2 as POST target
     
     # computing tally
-    url(r'^/compute_tally$', one_election_compute_tally),
-    url(r'^/combine_decryptions$', combine_decryptions),
-    url(r'^/release_result$', release_result),
+    url(r'^/compute_tally$', views.one_election_compute_tally, name=names.ELECTION_COMPUTE_TALLY),
+    url(r'^/combine_decryptions$', views.combine_decryptions, name=names.ELECTION_COMBINE_DECRYPTIONS),
+    url(r'^/release_result$', views.release_result, name=names.ELECTION_RELEASE_RESULT),
     
     # casting a ballot before we know who the voter is
-    url(r'^/cast$', one_election_cast),
-    url(r'^/cast_confirm$', one_election_cast_confirm),
-    url(r'^/password_voter_login$', password_voter_login),
-    url(r'^/cast_done$', one_election_cast_done),
+    url(r'^/cast$', views.one_election_cast, name=names.ELECTION_CAST),
+    url(r'^/cast_confirm$', views.one_election_cast_confirm, name=names.ELECTION_CAST_CONFIRM),
+    url(r'^/password_voter_login$', views.password_voter_login, name=names.ELECTION_PASSWORD_VOTER_LOGIN),
+    url(r'^/cast_done$', views.one_election_cast_done, name=names.ELECTION_CAST_DONE),
     
     # post audited ballot
-    url(r'^/post-audited-ballot', post_audited_ballot),
+    url(r'^/post-audited-ballot', views.post_audited_ballot, name=names.ELECTION_POST_AUDITED_BALLOT),
     
     # managing voters
-    url(r'^/voters/$', voter_list),
-    url(r'^/voters/upload$', voters_upload),
-    url(r'^/voters/upload-cancel$', voters_upload_cancel),
-    url(r'^/voters/list$', voters_list_pretty),
-    url(r'^/voters/eligibility$', voters_eligibility),
-    url(r'^/voters/email$', voters_email),
-    url(r'^/voters/(?P<voter_uuid>[^/]+)$', one_voter),
-    url(r'^/voters/(?P<voter_uuid>[^/]+)/delete$', voter_delete),
+    url(r'^/voters/$', views.voter_list, name=names.ELECTION_VOTERS_LIST),
+    url(r'^/voters/upload$', views.voters_upload, name=names.ELECTION_VOTERS_UPLOAD),
+    url(r'^/voters/upload-cancel$', views.voters_upload_cancel, name=names.ELECTION_VOTERS_UPLOAD_CANCEL),
+    url(r'^/voters/list$', views.voters_list_pretty, name=names.ELECTION_VOTERS_LIST_PRETTY),
+    url(r'^/voters/eligibility$', views.voters_eligibility, name=names.ELECTION_VOTERS_ELIGIBILITY),
+    url(r'^/voters/email$', views.voters_email, name=names.ELECTION_VOTERS_EMAIL),
+    url(r'^/voters/(?P<voter_uuid>[^/]+)$', views.one_voter, name=names.ELECTION_VOTER),
+    url(r'^/voters/(?P<voter_uuid>[^/]+)/delete$', views.voter_delete, name=names.ELECTION_VOTER_DELETE),
     
     # ballots
-    url(r'^/ballots/$', ballot_list),
-    url(r'^/ballots/(?P<voter_uuid>[^/]+)/all$', voter_votes),
-    url(r'^/ballots/(?P<voter_uuid>[^/]+)/last$', voter_last_vote),
+    url(r'^/ballots/$', views.ballot_list, name=names.ELECTION_BALLOTS_LIST),
+    url(r'^/ballots/(?P<voter_uuid>[^/]+)/all$', views.voter_votes, name=names.ELECTION_BALLOTS_VOTER),
+    url(r'^/ballots/(?P<voter_uuid>[^/]+)/last$', views.voter_last_vote, name=names.ELECTION_BALLOTS_VOTER_LAST),
 
 ]
diff --git a/helios/templates/_castconfirm_docast.html b/helios/templates/_castconfirm_docast.html
index fa6b3e70a48f53299dfa4215c3e6577f1effd014..1a91b213767ad733344124fe487ddc3ec67cfe14 100644
--- a/helios/templates/_castconfirm_docast.html
+++ b/helios/templates/_castconfirm_docast.html
@@ -23,7 +23,7 @@ You are logged in as <u>{{voter.display_html_big|safe}}</u><br /><br />
 </form>
 
 <p>
-    <button class="tiny" onclick="document.location='./view';">cancel</button><br />
+    <button class="tiny" onclick="document.location='{% url "election@view" election.uuid %}';">cancel</button><br />
     <span style="font-size:0.8em;">If you cancel now, your ballot will <em>NOT</em> be recorded.<br />
     You can start the voting process over again, of course.</span>
 </p>
diff --git a/helios/templates/_castconfirm_password.html b/helios/templates/_castconfirm_password.html
index 25e31de2145cfba6ca39ffb009667ea14993cac8..03e698af7800a10ffae24aec3bd5eacc032d1162 100644
--- a/helios/templates/_castconfirm_password.html
+++ b/helios/templates/_castconfirm_password.html
@@ -1,5 +1,5 @@
 Please provide the voter ID and password you received by email.<br /><br />
-<form method="post" action="{% url "helios.views.password_voter_login" election.uuid %}" onsubmit="show_waiting()">
+<form method="post" action="{% url "election@password-voter-login" election.uuid %}" onsubmit="show_waiting()">
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
 <input type="hidden" name="return_url" value="{{return_url}}" />
 <input type="hidden" name="cast_ballot" value="{{cast_ballot}}" />
diff --git a/helios/templates/cast_done.html b/helios/templates/cast_done.html
index 75265abb060e5c9b3e0582330e1261e09efaedf8..e0b9098f076e8fe3e8ef7a0eed787adf34b61627 100644
--- a/helios/templates/cast_done.html
+++ b/helios/templates/cast_done.html
@@ -20,7 +20,7 @@
 {% endif %}
 
 <p style="font-size: 1.4em;">
-[ <a href="{% url "helios.views.one_election_view" election.uuid %}">return to election info</a> ]
+[ <a href="{% url "election@view" election.uuid %}">return to election info</a> ]
 </p>
 
 {% endblock %}
diff --git a/helios/templates/castvote.html b/helios/templates/castvote.html
index 1c21d73f50e12e267c2ffbe247600813f12fb40d..21b5fa72fa719c811a449dd881c5e6d33dec3232 100644
--- a/helios/templates/castvote.html
+++ b/helios/templates/castvote.html
@@ -3,7 +3,7 @@
 {% block title %}{{cast_vote.vote_tinyhash}} &mdash; {{election.name}}{% endblock %}
 {% block content %}
 <h2 class="title">Cast Vote {{cast_vote.vote_tinyhash}}</h2>
-cast in <a href="{% url "helios.views.one_election_view" election.uuid %}">{{election.name}}</a><br />
+cast in <a href="{% url "election@view" election.uuid %}">{{election.name}}</a><br />
 Fingerprint: <tt>{{cast_vote.vote_hash}}</tt><br />
 by <b><u>
 {% if the_voter.alias %}
diff --git a/helios/templates/combine_decryptions.html b/helios/templates/combine_decryptions.html
index 3530867df835c5fbeb0d9d591b50d0842be7eb95..89d60f120b61cc4c70976d1f74f52a641890f2a7 100644
--- a/helios/templates/combine_decryptions.html
+++ b/helios/templates/combine_decryptions.html
@@ -2,7 +2,7 @@
 
 {% block title %}Compute Tally &mdash; {{election.name}}{% endblock %}
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Compute Tally <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">cancel</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Compute Tally <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">cancel</a>]</span></h2>
 
   <p>
     You are about to compute the tally for this election. You only will then see the results.
diff --git a/helios/templates/election_audited_ballots.html b/helios/templates/election_audited_ballots.html
index 2e01f9b3254d46ad750322e1996baa5c99bb3d60..8225c1bc03a8ccf3f58da8d26572bbf454d4dbed 100644
--- a/helios/templates/election_audited_ballots.html
+++ b/helios/templates/election_audited_ballots.html
@@ -3,7 +3,7 @@
 {% block title %}Audited Ballots for {{election.name}}{% endblock %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Audited Ballots <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election_uuid=election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Audited Ballots <span style="font-size:0.7em;">[<a href="{% url "election@view" election_uuid=election.uuid %}">back to election</a>]</span></h2>
 
 <p>
 When you prepare a ballot with Helios, you immediately receive a smart ballot tracker. Before you choose to cast that ballot, you have the option to ask Helios to "break open" that encrypted ballot and verify that Helios encrypted your ballot correctly. Once that's done, you can post that opened ballot here, on the audited ballots' list, for everyone to verify (your identity is not included). Once you've done this, you have to re-encrypt your choices and obtain a different smart ballot tracker. This helps reduce the chance that someone might coerce you to vote differently from your true choice.
@@ -14,7 +14,7 @@ These ballots are <em>not cast</em>, and they will not be counted. They are just
 </p>
 
 <p>
-  To verify an audited ballot, copy its entire content and paste it in the <a target="_new" href="/booth/single-ballot-verify.html?election_url={% url "helios.views.one_election" election.uuid %}">single ballot verifier</a>.
+  To verify an audited ballot, copy its entire content and paste it in the <a target="_new" href="/booth/single-ballot-verify.html?election_url={% url "election@home" election.uuid %}">single ballot verifier</a>.
 </p>
 
 {% if audited_ballots %}
diff --git a/helios/templates/election_bboard.html b/helios/templates/election_bboard.html
index a5fd7e7d9dd14bf16f26373bb97c4c277906707a..25821934c5227c7a9695d5552c6018787a8afdf4 100644
--- a/helios/templates/election_bboard.html
+++ b/helios/templates/election_bboard.html
@@ -3,7 +3,7 @@
 {% block title %}Ballot Tracking Center for {{election.name}}{% endblock %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Ballot Tracking Center <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election_uuid=election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Ballot Tracking Center <span style="font-size:0.7em;">[<a href="{% url "election@view" election_uuid=election.uuid %}">back to election</a>]</span></h2>
 
 <p>
   This is the ballot tracking center, which displays the tracking numbers of all cast ballots in this election.
@@ -16,15 +16,15 @@
 Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp;
 
 {% if next_after %}
-<a href="./bboard?after={{next_after}}&offset={{offset_plus_limit}}">next {{limit}}</a> &nbsp;&nbsp;
+<a href="{% url "election@bboard" election.uuid %}?after={{next_after}}&offset={{offset_plus_limit}}">next {{limit}}</a> &nbsp;&nbsp;
 {% endif %}
 
 {% ifequal offset 0 %}
 {% else %}
-<a href="./bboard">back to start</a> &nbsp;&nbsp;
+<a href="{% url "election@bboard" election.uuid %}">back to start</a> &nbsp;&nbsp;
 {% endifequal %}
 {% if more_p %}
-<a href="./bboard?after={{next_after}}&offset={{next_offset}}">next {{limit}}</a>
+<a href="{% url "election@bboard" election.uuid %}?after={{next_after}}&offset={{next_offset}}">next {{limit}}</a>
 {% endif %}
 <table class="pretty">
 <tr><th>
@@ -40,7 +40,7 @@ Name
 {{voter.alias}}
 {% else %}
 <img border="0" height="20" src="/static/auth/login-icons/{{voter.voter_type}}.png" alt="{{voter.voter_type}}" /> {% if voter.name %}{{voter.name}}{% else %}{{voter.voter_id}}{% endif %}
-{% endif %}</td><td><tt style="font-size: 1.4em;;">{% if voter.vote_hash %}{{voter.vote_hash}} <span style="font-size:0.8em;">[<a href="{% url "helios.views.voter_last_vote" election_uuid=election.uuid voter_uuid=voter.uuid %}">view</a>]</span>{% else %}&mdash;{% endif %}</tt></td></tr>
+{% endif %}</td><td><tt style="font-size: 1.4em;;">{% if voter.vote_hash %}{{voter.vote_hash}} <span style="font-size:0.8em;">[<a href="{% url "election@ballots@voter@last" election_uuid=election.uuid voter_uuid=voter.uuid %}">view</a>]</span>{% else %}&mdash;{% endif %}</tt></td></tr>
 {% endfor %}
 </table>
 
diff --git a/helios/templates/election_build.html b/helios/templates/election_build.html
index 4526d6a05fa75ff5c2b194b8c85ace21635f4335..8f56185fcb93e2c5092168794bfae0cb4c15df72 100644
--- a/helios/templates/election_build.html
+++ b/helios/templates/election_build.html
@@ -1,7 +1,7 @@
 {% extends "helios/templates/cryptobase.html" %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Questions <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Questions <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h2>
 
   <script language="javascript">
 {% if election.questions %}
diff --git a/helios/templates/election_cast_confirm.html b/helios/templates/election_cast_confirm.html
index 346284c6b9670de2e8968a9ed9a6c24cdb733d28..173d729c62997569d22c4b20fbcf081e775cc8c5 100644
--- a/helios/templates/election_cast_confirm.html
+++ b/helios/templates/election_cast_confirm.html
@@ -73,7 +73,7 @@ requires election-specific credentials.
   {% endif %}
   </b><br /></p>
 <p>
-    [<a href="{% url "helios.views.one_election_view" election.uuid %}">return to the main election page</a>]
+    [<a href="{% url "election@view" election.uuid %}">return to the main election page</a>]
 </p>
 {% else %}
 <p>
diff --git a/helios/templates/election_compute_tally.html b/helios/templates/election_compute_tally.html
index fd98440e3466bdd0d5b1cbfbf8dcdaa263514289..2ad050a0286f6787f84c9349a0b4b3b7170bf8e4 100644
--- a/helios/templates/election_compute_tally.html
+++ b/helios/templates/election_compute_tally.html
@@ -19,12 +19,12 @@
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
     
 <input class="button" type="submit" value="compute encrypted tally!" />
-<button onclick="document.location='./view'; return false;">never mind</button>
+<button onclick="document.location='{% url "election@view" election.uuid %}'; return false;">never mind</button>
 </form>
 {% else %}
 <p>
 No votes have been cast in this election. At least one vote must be cast before you compute the tally.<br /><br />
-<a href="./view">back to election</a>
+<a href="{% url "election@view" election.uuid %}">back to election</a>
 </p>
 {% endif %}
 </div>
diff --git a/helios/templates/election_edit.html b/helios/templates/election_edit.html
index 2519fb704d4e74a821a43cd792505179961cd8f4..025b2585513d0240f0005e58de3b80e88f24f375 100644
--- a/helios/templates/election_edit.html
+++ b/helios/templates/election_edit.html
@@ -2,7 +2,7 @@
 
 {% block content %}
 
-  <h2 class="title">{{election.name}} &mdash; Update <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">cancel</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Update <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">cancel</a>]</span></h2>
   
 {% if error %}
 <p style="color: red;">
diff --git a/helios/templates/election_extend.html b/helios/templates/election_extend.html
index 0db2c448ba96143d1f11d709f6ff924e4da8c46a..813afe7fd8309d449a63f505ef0327d3be23bef1 100644
--- a/helios/templates/election_extend.html
+++ b/helios/templates/election_extend.html
@@ -2,7 +2,7 @@
 
 {% block content %}
 
-  <h2 class="title">{{election.name}} &mdash; Extend Voting <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">cancel</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Extend Voting <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">cancel</a>]</span></h2>
   
   <form class="prettyform" action="" method="POST" id="edit_election_form">
     <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
diff --git a/helios/templates/election_freeze.html b/helios/templates/election_freeze.html
index a0aad4dd0eb5b03443c166a996efdf84269f1811..f0229be99638b268af28613b7fc0e83a302f799c 100644
--- a/helios/templates/election_freeze.html
+++ b/helios/templates/election_freeze.html
@@ -29,14 +29,14 @@ You must freeze the ballot before you can contact voters.
         <li>{{issue.action}}</li>
         {% endfor %}
     </ul>
-    <a href="{% url "helios.views.one_election_view" election.uuid %}">go back to the election</a>
+    <a href="{% url "election@view" election.uuid %}">go back to the election</a>
 </p>
 {% else %}
 <form method="post" action="">
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
     
 <input class="button" type="submit" value="Freeze the ballot" />
-<button onclick="document.location='./view'; return false;">never mind</button>
+<button onclick="document.location='{% url "election@view" election.uuid %}'; return false;">never mind</button>
 </form>
 {% endif %}
 
diff --git a/helios/templates/election_keygenerator.html b/helios/templates/election_keygenerator.html
index 4521fc9393185cf177f5e4cba6d3f69b2193ef46..bce34b8755bce301212faba9ce284908a1d495b6 100644
--- a/helios/templates/election_keygenerator.html
+++ b/helios/templates/election_keygenerator.html
@@ -35,7 +35,7 @@ $(document).ready(function() {
     $('#generator').hide();
 
     // get some more server-side randomness for keygen
-    $.getJSON('../../get-randomness', function(result) {
+    $.getJSON('{% url "election@get-randomness" election.uuid %}', function(result) {
        sjcl.random.addEntropy(result.randomness);
        BigInt.setup(function() {
           ELGAMAL_PARAMS = ElGamal.Params.fromJSONObject({{eg_params_json|safe}});
@@ -159,7 +159,7 @@ Your key has been generated, but you may choose to<br /><a href="javascript:clea
 </p>
 </div>
 
-<form method="post" id="pk_form" action="{% url "helios.views.trustee_upload_pk" election.uuid trustee.uuid %}">
+<form method="post" id="pk_form" action="{% url "election@trustee@upload-pk" election.uuid trustee.uuid %}">
 <h3>Your Public Key</h3>
 <p>
     It's time to upload the public key to the server.
diff --git a/helios/templates/election_not_started.html b/helios/templates/election_not_started.html
index 4ba944e1a8a3b1ab9eb8351b5a2347f46e58c28f..5fba613a3aef9c42fac05fadf9f6985df5e608df 100644
--- a/helios/templates/election_not_started.html
+++ b/helios/templates/election_not_started.html
@@ -9,6 +9,6 @@
   </p>
   
   <p>
-      <a href="{% url "helios.views.one_election_view" election.uuid %}">back to the election</a>
+      <a href="{% url "election@view" election.uuid %}">back to the election</a>
   </p>
 {% endblock %}
diff --git a/helios/templates/election_questions.html b/helios/templates/election_questions.html
index d7b8f7353c69025b2c4d04d2f7318b3bdeede240..468c65ecf751335f11968aabc5f2e0e9dd8a45d8 100644
--- a/helios/templates/election_questions.html
+++ b/helios/templates/election_questions.html
@@ -2,7 +2,7 @@
 
 {% block title %}Questions for {{election.name}}{% endblock %}
 {% block content %}
-  <h3 class="title">{{election.name}} &mdash; Questions <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h3>
+  <h3 class="title">{{election.name}} &mdash; Questions <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h3>
 
   <script language="javascript">
 {% if election.questions %}
diff --git a/helios/templates/election_register.html b/helios/templates/election_register.html
index e1c731e0ca219ede8118caddb3fb0bca29dd1333..96a6004559183e637159bf056f614f1ef9da47be 100644
--- a/helios/templates/election_register.html
+++ b/helios/templates/election_register.html
@@ -16,7 +16,7 @@
     You are <em>not</em> registered for this election.
 </p>
 
-<form method="post" action="{% url "helios.views.one_election_register" election.uuid %}">
+<form method="post" action="{% url "election@register" election.uuid %}">
 <input type="submit" value="register!" />
 </form>
 {% endif %}
diff --git a/helios/templates/election_tallied.html b/helios/templates/election_tallied.html
index 9b00b636e94be8bcd05bfbe8d1a2a37412947b40..b7116822c5b31bb96c300cc2219a43e3782e32eb 100644
--- a/helios/templates/election_tallied.html
+++ b/helios/templates/election_tallied.html
@@ -9,6 +9,6 @@
   </p>
   
   <p>
-      <a href="{% url "helios.views.one_election_view" election.uuid %}">view the election tally</a>
+      <a href="{% url "election@view" election.uuid %}">view the election tally</a>
   </p>
 {% endblock %}
\ No newline at end of file
diff --git a/helios/templates/election_view.html b/helios/templates/election_view.html
index 5973c20292f9323cbaa5a3abe427e047e7796d89..8eccf4faa9fbebad95fec71db466a495860c5f69 100644
--- a/helios/templates/election_view.html
+++ b/helios/templates/election_view.html
@@ -5,7 +5,7 @@
   <h3 class="title">{{ election.name }}
 {% if admin_p %}
 {% if not election.frozen_at %}
-<small><a class="small button" href="{% url "helios.views.one_election_edit" election.uuid %}">edit</a></small>
+<small><a class="small button" href="{% url "election@edit" election.uuid %}">edit</a></small>
 {% endif %}
 {% endif %}</h3>
 <p style="padding-top:0px; margin-top:0px">
@@ -14,8 +14,8 @@
 [archived]
 {% endif %}
 {% if admin_p %}
-&nbsp;{% if election.is_archived %}<a class="small button" href="{% url "helios.views.one_election_archive" election_uuid=election.uuid %}?archive_p=0">unarchive it</a>{% else %}<a class="small button" href="{% url "helios.views.one_election_archive" election_uuid=election.uuid %}?archive_p=1">archive it</a>{% endif %}
-<a class="small button" onclick="return window.confirm('Are you sure you want to copy this election?');" href="{% url "helios.views.one_election_copy" election_uuid=election.uuid %}">copy</a>
+&nbsp;{% if election.is_archived %}<a class="small button" href="{% url "election@archive" election_uuid=election.uuid %}?archive_p=0">unarchive it</a>{% else %}<a class="small button" href="{% url "election@archive" election_uuid=election.uuid %}?archive_p=1">archive it</a>{% endif %}
+<a class="small button" onclick="return window.confirm('Are you sure you want to copy this election?');" href="{% url "election@copy" election_uuid=election.uuid %}">copy</a>
 {% endif %}
 <br />
 {% if admin_p %}
@@ -23,12 +23,12 @@
 {% if election.featured_p %}
 this {{election.election_type}} is featured on the front page.
 {% if can_feature_p %}
-[<a href="{% url "helios.views.one_election_set_featured" election.uuid %}?featured_p=0">unfeature it</a>]
+[<a href="{% url "election@set-featured" election.uuid %}?featured_p=0">unfeature it</a>]
 {% endif %}
 {% else %}
 this {{election.election_type}} is <u>not</u> featured on the front page.
 {% if can_feature_p %}
-[<a href="{% url "helios.views.one_election_set_featured" election.uuid %}?featured_p=1">feature it</a>]
+[<a href="{% url "election@set-featured" election.uuid %}?featured_p=1">feature it</a>]
 {% endif %}
 {% endif %}
 {% endif %}
@@ -51,11 +51,11 @@ this {{election.election_type}} is <u>not</u> featured on the front page.
 {% endif %}
 
 <p align="center" style="font-size: 1.5em;">
-<a href="{% url "helios.views.one_election_questions" election.uuid %}">questions ({% if election.questions %}{{election.questions|length}}{% else %}0{% endif %})</a>
+<a href="{% url "election@questions" election.uuid %}">questions ({% if election.questions %}{{election.questions|length}}{% else %}0{% endif %})</a>
 &nbsp;&nbsp;|&nbsp;&nbsp;
-<a href="{% url "helios.views.voters_list_pretty" election.uuid %}">voters &amp; ballots</a>
+<a href="{% url "election@voters@list-pretty" election.uuid %}">voters &amp; ballots</a>
 &nbsp;&nbsp;|&nbsp;&nbsp;
-<a href="{% url "helios.views.list_trustees_view" election.uuid %}">trustees ({{trustees|length}})</a>
+<a href="{% url "election@trustees@view" election.uuid %}">trustees ({{trustees|length}})</a>
 </p>
 
 {% if admin_p %}
@@ -87,7 +87,7 @@ this {{election.election_type}} is <u>not</u> featured on the front page.
 {{issue.action}}{% if forloop.last %}{% else %}, and{% endif %}<br />
 {% endfor %}
 {% else %}
-<a href="{% url "helios.views.one_election_freeze" election.uuid %}">freeze ballot and open election.</a>
+<a href="{% url "election@freeze" election.uuid %}">freeze ballot and open election.</a>
 <br />
 {% if election.voting_starts_at %}
 once you do this, the election will be ready for voting and will open automatically<br />
@@ -104,20 +104,20 @@ once you do this, the election will be immediately open for voting.
 Tally computation is under way.<br />
 Reload this page in a couple of minutes.
 {% else %}
-<a href="{% url "helios.views.one_election_compute_tally" election.uuid %}">compute encrypted tally</a><br />
+<a href="{% url "election@compute-tally" election.uuid %}">compute encrypted tally</a><br />
 The encrypted votes will be combined into an encrypted tally. Once this is done,<br />
 trustees will be asked to provide their share of the decryption.
 {% endif %}
 {% else %}
 
 {% if election.result %}
-<a href="{% url "helios.views.release_result" election.uuid %}">release result</a><br />
+<a href="{% url "election@release-result" election.uuid %}">release result</a><br />
 The result displayed below is visible only to you.<br />
 Once you release the result, it will be visible to everyone.
 {% else %}
 
 {% if election.ready_for_decryption_combination %}
-<a href="{% url "helios.views.combine_decryptions" election.uuid %}">
+<a href="{% url "election@combine-decryptions" election.uuid %}">
 {% if election.num_trustees == 1 %}
 compute results
 {% else %}
@@ -131,7 +131,7 @@ The decryption shares from the trustees will be combined and the tally computed.
 Once you do this, the tally will visible to you, the administrator, only.
 {% endif %}
 {% else %}
-<a href="{% url "helios.views.list_trustees_view" election.uuid %}">trustees (for decryption)</a>
+<a href="{% url "election@trustees@view" election.uuid %}">trustees (for decryption)</a>
 {% endif %}
 
 {% endif %}
@@ -249,7 +249,7 @@ Anyone can vote in this election.
 {% endif %}
 
 {% if admin_p and election.voting_ends_at and not election.tallying_started_at %}
-<br /><a href="{% url "helios.views.one_election_extend" election.uuid %}">extend voting</a><br />
+<br /><a href="{% url "election@extend" election.uuid %}">extend voting</a><br />
 {% endif %}
 
 <div style="background: lightyellow; padding:5px; padding-left: 10px; margin-top: 15px; border: 1px solid #aaa; width: 720px;" class="round">
@@ -271,22 +271,22 @@ Anyone can vote in this election.
 {% endif %}
 
 <p style="font-size: 1.3em;">
-<a href="{% url "helios.views.voters_list_pretty" election.uuid %}">Ballot Tracking Center</a> &nbsp;| &nbsp;
-<a href="{% url "helios.views.one_election_audited_ballots" election.uuid %}">Audited Ballots</a>
+<a href="{% url "election@voters@list-pretty" election.uuid %}">Ballot Tracking Center</a> &nbsp;| &nbsp;
+<a href="{% url "election@audited-ballots" election.uuid %}">Audited Ballots</a>
 </p>
 
 {% endif %}
 
 {% if not election.voting_has_started %}
 <p style="font-size: 1.2em;">
-  <a href="{{SECURE_URL_HOST}}/booth/vote.html?election_url={% url "helios.views.one_election" election.uuid %}">preview booth</a>
+  <a href="{{SECURE_URL_HOST}}/booth/vote.html?election_url={% url "election@home" election.uuid %}">preview booth</a>
 </p>
 {% endif %}  
 
 {% if election.voting_has_stopped %}
 <p style="font-size: 1.2em;">
 {% if election.result %}
-verify <a target="_blank" href="/verifier/verify.html?election_url={% url "helios.views.one_election" election.uuid %}">election tally</a>.
+verify <a target="_blank" href="/verifier/verify.html?election_url={% url "election@home" election.uuid %}">election tally</a>.
 {% endif %}
 
 review the <a href="{{vote_url}}">voting booth</a>.
diff --git a/helios/templates/elections_administered.html b/helios/templates/elections_administered.html
index 03bc226c6583e2ab94b516b05bd16efbf1128b30..563ecc9fe5450e42a2b2ae9ed144648b4eb5e9bb 100644
--- a/helios/templates/elections_administered.html
+++ b/helios/templates/elections_administered.html
@@ -5,7 +5,7 @@
 
 <ul>
 {% for election in elections %}
-<li> <a href="{% url "helios.views.one_election_view" election.uuid %}">{{election.name}}</a><em> - {{election.num_voters}} voters / {{election.num_cast_votes}} cast votes</em></li>
+<li> <a href="{% url "election@view" election.uuid %}">{{election.name}}</a><em> - {{election.num_voters}} voters / {{election.num_cast_votes}} cast votes</em></li>
 {% endfor %}
 </ul>
 {% endblock %}
\ No newline at end of file
diff --git a/helios/templates/elections_voted.html b/helios/templates/elections_voted.html
index 7447eb09f63ef179d5e9afa0166b8f5736cf2b05..f013a983b72c4991f9d4a6a353747a55b5708193 100644
--- a/helios/templates/elections_voted.html
+++ b/helios/templates/elections_voted.html
@@ -5,7 +5,7 @@
 
 <ul>
 {% for election in elections %}
-<li> <a href="{% url "helios.views.one_election_view" election.uuid %}">{{election.name}}</a></li>
+<li> <a href="{% url "election@view" election.uuid %}">{{election.name}}</a></li>
 {% endfor %}
 </ul>
 {% endblock %}
diff --git a/helios/templates/list_trustees.html b/helios/templates/list_trustees.html
index 39ddd5553f74b66896be55c57693f5449df41305..47032c4d1c5e65cf2b476003edba3d24069968b6 100644
--- a/helios/templates/list_trustees.html
+++ b/helios/templates/list_trustees.html
@@ -3,7 +3,7 @@
 {% block title %}Trustees for {{election.name}}{% endblock %}
 
 {% block content %}
-  <h3 class="title">{{election.name}} &mdash; Trustees <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h3>
+  <h3 class="title">{{election.name}} &mdash; Trustees <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h3>
 
 <p>
     Trustees are responsible for decrypting the election result.<br />
@@ -21,11 +21,11 @@
 
 {% if admin_p %}
 <p>
-    [ <a onclick="return(confirm('Adding your own trustee requires a good bit more work to tally the election.\nYou will need to have trustees generate keypairs and safeguard their secret key.\n\nIf you are not sure what that means, we strongly recommend\nclicking Cancel and letting Helios tally the election for you.'));" href="{% url "helios.views.new_trustee" election.uuid %}">add a trustee</a> ]
+    [ <a onclick="return(confirm('Adding your own trustee requires a good bit more work to tally the election.\nYou will need to have trustees generate keypairs and safeguard their secret key.\n\nIf you are not sure what that means, we strongly recommend\nclicking Cancel and letting Helios tally the election for you.'));" href="{% url "election@trustees@new" election.uuid %}">add a trustee</a> ]
 </p>
 {% if not election.has_helios_trustee %}
 <p>
-    <a href="{% url "helios.views.new_trustee_helios" election.uuid %}">add Helios as a trustee</a>
+    <a href="{% url "election@trustees@add-helios" election.uuid %}">add Helios as a trustee</a>
 </p>
 {% endif %}
 {% endif %}
@@ -39,11 +39,11 @@
 <h5> Trustee #{{forloop.counter}}: {{t.name}} 
 {% if admin_p %}
 {% if t.secret_key %}
-{% if not election.frozen_at %}[<a onclick="return confirm('Are you sure you want to remove Helios as a trustee?');" href="{% url "helios.views.delete_trustee" election.uuid %}?uuid={{t.uuid}}">x</a>]{% endif %}
+{% if not election.frozen_at %}[<a onclick="return confirm('Are you sure you want to remove Helios as a trustee?');" href="{% url "election@trustees@delete" election.uuid %}?uuid={{t.uuid}}">x</a>]{% endif %}
 {% else %}
 ({{t.email}})
-{% if not election.frozen_at %}[<a onclick="return confirm('Are you sure you want to remove this Trustee?');" href="{% url "helios.views.delete_trustee" election.uuid %}?uuid={{t.uuid}}">x</a>]{% endif %}
-[<a onclick="return confirm('Are you sure you want to send this trustee his/her admin URL?');" href="{% url "helios.views.trustee_send_url" election.uuid t.uuid %}">send login</a>]
+{% if not election.frozen_at %}[<a onclick="return confirm('Are you sure you want to remove this Trustee?');" href="{% url "election@trustees@delete" election.uuid %}?uuid={{t.uuid}}">x</a>]{% endif %}
+[<a onclick="return confirm('Are you sure you want to send this trustee his/her admin URL?');" href="{% url "election@trustee@send-url" election.uuid t.uuid %}">send login</a>]
 {% endif %}
 {% endif %}
 </h5>
diff --git a/helios/templates/new_trustee.html b/helios/templates/new_trustee.html
index 0df1a27c287fcb2a8a960315604ea7e94ec37370..75af0545bd60262c22a9349ea8ae33581cf73a22 100644
--- a/helios/templates/new_trustee.html
+++ b/helios/templates/new_trustee.html
@@ -1,7 +1,7 @@
 {% extends "helios/templates/cryptobase.html" %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; New Trustee <span style="font-size:0.7em;">[<a href="{% url "helios.views.list_trustees_view" election.uuid %}">cancel</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; New Trustee <span style="font-size:0.7em;">[<a href="{% url "election@trustees@view" election.uuid %}">cancel</a>]</span></h2>
   
 <form method="post" action="">
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
diff --git a/helios/templates/release_result.html b/helios/templates/release_result.html
index cac6c64a7a6e62d07691ecbf877d09780607c495..5e467e471cb58ccee1319e362109a96d461946a5 100644
--- a/helios/templates/release_result.html
+++ b/helios/templates/release_result.html
@@ -2,7 +2,7 @@
 
 {% block title %}Release Result &mdash; {{election.name}}{% endblock %}
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Release Result <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">cancel</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Release Result <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">cancel</a>]</span></h2>
 
   <p>
     You are about to release the result for this election.
diff --git a/helios/templates/stats_elections.html b/helios/templates/stats_elections.html
index 215225bc17c28d2ad6c7c1a64eff7cbbe97def5b..e9a498ef8e9a5a21d5069eb3ac5861ff4726dd41 100644
--- a/helios/templates/stats_elections.html
+++ b/helios/templates/stats_elections.html
@@ -26,7 +26,7 @@ Elections {{elections_page.start_index}} - {{elections_page.end_index}} (of {{to
 
 {% for election in elections %}
 <p>
-<b><a href="{% url "helios.views.one_election_view" election.uuid %}">{{election.name}}</a></b> by <a href="mailto:{{election.admin.info.email}}">{{election.admin.pretty_name}}</a> -- {{election.num_voters}} voters / {{election.num_cast_votes}} cast votes
+<b><a href="{% url "election@view" election.uuid %}">{{election.name}}</a></b> by <a href="mailto:{{election.admin.info.email}}">{{election.admin.pretty_name}}</a> -- {{election.num_voters}} voters / {{election.num_cast_votes}} cast votes
 </p>
 {% endfor %}
 
diff --git a/helios/templates/stats_problem_elections.html b/helios/templates/stats_problem_elections.html
index 9f8c1dadd43bf52905d1c844088443ea72da07b0..2f82f74b92050540ce84ab43f4e522d87ea0f92d 100644
--- a/helios/templates/stats_problem_elections.html
+++ b/helios/templates/stats_problem_elections.html
@@ -8,7 +8,7 @@ Unfrozen for more than a day.
 
 {% for election in elections %}
 <p>
-<b><a href="{% url "helios.views.one_election_view" election.uuid %}">{{election.name}}</a></b> -- {{election.num_voters}} voters
+<b><a href="{% url "election@view" election.uuid %}">{{election.name}}</a></b> -- {{election.num_voters}} voters
 </p>
 {% endfor %}
 
diff --git a/helios/templates/stats_recent_votes.html b/helios/templates/stats_recent_votes.html
index 37c074161f3f973c4bab1d9c4f2d2118c79f327c..bf360a28482a477bcecfb0766045f39563167f71 100644
--- a/helios/templates/stats_recent_votes.html
+++ b/helios/templates/stats_recent_votes.html
@@ -8,7 +8,7 @@ Last 24 hours
 
 {% for election in elections %}
 <p>
-<b><a href="{% url "helios.views.one_election_view" election.uuid %}">{{election.name}}</a></b> -- {{election.last_cast_vote}} {{election.num_recent_cast_votes}} recently cast votes
+<b><a href="{% url "election@view" election.uuid %}">{{election.name}}</a></b> -- {{election.last_cast_vote}} {{election.num_recent_cast_votes}} recently cast votes
 </p>
 {% endfor %}
 
diff --git a/helios/templates/trustee_check_sk.html b/helios/templates/trustee_check_sk.html
index 81afe42d4945f3b9856dc31a1eab792d3647c6db..99380d31c5e8024fab0c51edbbb785c233d3c73c 100644
--- a/helios/templates/trustee_check_sk.html
+++ b/helios/templates/trustee_check_sk.html
@@ -43,7 +43,7 @@ function check_sk(sk_value) {
     }
 }
 </script>
-  <h2 class="title">{{election.name}} &mdash; Trustee {{trustee.name}} &mdash; Check Secret Key <span style="font-size:0.7em;">[<a href="./home">back to trustee home</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Trustee {{trustee.name}} &mdash; Check Secret Key <span style="font-size:0.7em;">[<a href="{% url "election@trustee" election_uuid=election.uuid trustee_uuid=trustee.uuid %}">back to trustee home</a>]</span></h2>
 
 <p>
 Your public key fingerprint is: <b>{{trustee.public_key_hash}}</b>
diff --git a/helios/templates/trustee_decrypt_and_prove.html b/helios/templates/trustee_decrypt_and_prove.html
index 05153b8a349b2ae8b91b5de283f2bc850ab89f63..cb4c2e68caa5b627ffdd12284ba1805105a1f5a8 100644
--- a/helios/templates/trustee_decrypt_and_prove.html
+++ b/helios/templates/trustee_decrypt_and_prove.html
@@ -195,7 +195,7 @@ function reset() {
   </div>
   
   <div id="done_div">
-      Done! <a href="{% url "helios.views.one_election_view" election.uuid %}">Back to election</a>
+      Done! <a href="{% url "election@view" election.uuid %}">Back to election</a>
   </div>
   
   <div id="error_div">
diff --git a/helios/templates/trustee_home.html b/helios/templates/trustee_home.html
index 5f6ee9c54e66c1884114827b208f518888c96bc8..8d6dd115179c563bd90cb2886813e6285dd97d71 100644
--- a/helios/templates/trustee_home.html
+++ b/helios/templates/trustee_home.html
@@ -7,9 +7,9 @@
 {% if trustee.public_key_hash %}
 You have successfully uploaded your public key.<br />
 Your public key fingerprint is: <b>{{trustee.public_key_hash}}</b>.<br />
-You can <a href="{% url "helios.views.trustee_check_sk" election.uuid trustee.uuid %}">verify that you have the right secret key</a>.
+You can <a href="{% url "election@trustee@check-sk" election.uuid trustee.uuid %}">verify that you have the right secret key</a>.
 {% else %}
-<a href="{% url "helios.views.trustee_keygenerator" election.uuid trustee.uuid %}">setup your key</a>
+<a href="{% url "election@trustee@key-generator" election.uuid trustee.uuid %}">setup your key</a>
 {% endif %}
 </p>
 
@@ -19,7 +19,7 @@ You can <a href="{% url "helios.views.trustee_check_sk" election.uuid trustee.uu
 You have successfully uploaded your decryption.
 {% else %}
     The encrypted tally for this election is ready.<br />
-    <a href="{% url "helios.views.trustee_decrypt_and_prove" election.uuid trustee.uuid %}">decrypt with your key</a>
+    <a href="{% url "election@trustee@decrypt-and-prove" election.uuid trustee.uuid %}">decrypt with your key</a>
 {% endif %}
 {% else %}
 Once the tally is computed, come back here to provide your secret key for decryption purposes.<br />
diff --git a/helios/templates/voters_eligibility.html b/helios/templates/voters_eligibility.html
index 51343befd47591e0b937a484a32b4a3dfe7675ea..0baa6f7f968ddf5067580f18e75c28d69c353730 100644
--- a/helios/templates/voters_eligibility.html
+++ b/helios/templates/voters_eligibility.html
@@ -2,7 +2,7 @@
 
 {% block title %}Voter Eligibility for {{election.name}}{% endblock %}
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Voter Eligibility <span style="font-size:0.7em;">[<a href="{% url "helios.views.voters_list_pretty" election.uuid %}">back to voters</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Voter Eligibility <span style="font-size:0.7em;">[<a href="{% url "election@voters@list-pretty" election.uuid %}">back to voters</a>]</span></h2>
 
 <p>
 <em>{{election.pretty_eligibility|safe}}</em>
diff --git a/helios/templates/voters_email.html b/helios/templates/voters_email.html
index 535f7533fbeaf6cd87753c2f5f0c8788f03f4a95..62a6c7d63bc52eb57da0c0353a1151ba193b0938 100644
--- a/helios/templates/voters_email.html
+++ b/helios/templates/voters_email.html
@@ -9,7 +9,7 @@ voter_id = '{{voter.voter_id}}';
 {% endif %}
 </script>
 
-  <h2 class="title">{{election.name}} &mdash; Contact Voters <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Contact Voters <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h2>
 
 {% if voter %}  
   <p>
@@ -55,7 +55,7 @@ You may tweak the subject and add a custom message using the form below.
   </div>
   
   <div id="done" style="display:none;">
-    Done, go <a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>.
+    Done, go <a href="{% url "election@view" election.uuid %}">back to election</a>.
   </div>
 
   <div id="error" style="display:none;">
diff --git a/helios/templates/voters_list.html b/helios/templates/voters_list.html
index fffe57fdbc717c6c97cb39f4527938bccdacf811..9c1f6115e0847d8bdb4034bade576c68456937aa 100644
--- a/helios/templates/voters_list.html
+++ b/helios/templates/voters_list.html
@@ -2,7 +2,7 @@
 
 {% block title %}Voters &amp; Ballot Tracking Center for {{election.name}}{% endblock %}
 {% block content %}
-  <h3 class="title">{{election.name}} &mdash; Voters and Ballot Tracking Center <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h3>
+  <h3 class="title">{{election.name}} &mdash; Voters and Ballot Tracking Center <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h3>
 
 <p>
 <b>Who can vote?</b>
@@ -18,7 +18,7 @@
 <em>Your election is marked private, which means you cannot open registration up more widely</em>.<br />
 {% else %}
 You can change this setting:
-<form method="post" action="{% url "helios.views.voters_eligibility" election.uuid %}">
+<form method="post" action="{% url "election@voters@eligibility" election.uuid %}">
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
 <input type="radio" name="eligibility" value="openreg" {% if election.openreg and not election.eligibility %}CHECKED{% endif %} /> anyone can vote<br />
 <input type="radio" name="eligibility" value="closedreg" {% if not election.openreg %}CHECKED{% endif %} /> only voters listed explicitly below can vote<br />
@@ -37,7 +37,7 @@ You can change this setting:
 {% endif %}
 
 {% if email_voters and election.frozen_at and admin_p %}
-<p><a class="button" href="{% url "helios.views.voters_email" election.uuid %}">email voters</a></p>
+<p><a class="button" href="{% url "election@voters@email" election.uuid %}">email voters</a></p>
 {% endif %}
 
 {% if election.num_voters > 20 %}
@@ -45,7 +45,7 @@ You can change this setting:
 {% if q %}
 <p><em>searching for <u>{{q}}</u>.</em> [<a href="?">clear search</a>]</p>
 {% else %}
-<form method="get" action="{% url "helios.views.voters_list_pretty" election.uuid %}"><b>search</b>: <input type="text" name="q" /> <input type="submit" value="search" /></form>
+<form method="get" action="{% url "election@voters@list-pretty" election.uuid %}"><b>search</b>: <input type="text" name="q" /> <input type="submit" value="search" /></form>
 {% endif %}
 </p>
 {% endif %}
@@ -54,7 +54,7 @@ You can change this setting:
 <!-- Add a Voter: WORK HERE-->
 {% if upload_p and not election.openreg %}
 <p>
-<a class="button" href="{% url "helios.views.voters_upload" election_uuid=election.uuid %}">bulk upload voters</a>
+<a class="button" href="{% url "election@voters@upload" election_uuid=election.uuid %}">bulk upload voters</a>
 </p>
 
 {% if voter_files %}
@@ -99,14 +99,14 @@ no votes yet
 </p>
 
 {% if voters_page.has_previous %}
-<a href="./list?page={{voters_page.previous_page_number}}&limit={{limit}}&q={{q|urlencode}}">previous {{limit}}</a> &nbsp;&nbsp;
+<a href="{% url "election@voters@list-pretty" election.uuid %}?page={{voters_page.previous_page_number}}&limit={{limit}}&q={{q|urlencode}}">previous {{limit}}</a> &nbsp;&nbsp;
 {% endif %}
 
 
 Voters {{voters_page.start_index}} - {{voters_page.end_index}} (of {{total_voters}})&nbsp;&nbsp;
 
 {% if voters_page.has_next %}
-<a href="./list?page={{voters_page.next_page_number}}&limit={{limit}}&q={{q|urlencode}}">next {{limit}}</a> &nbsp;&nbsp;
+<a href="{% url "election@voters@list-pretty" election.uuid %}?page={{voters_page.next_page_number}}&limit={{limit}}&q={{q|urlencode}}">next {{limit}}</a> &nbsp;&nbsp;
 {% endif %}
 
 <table class="pretty">
@@ -131,9 +131,9 @@ Voters {{voters_page.start_index}} - {{voters_page.end_index}} (of {{total_voter
 {% if admin_p %}
 <td style="white-space: nowrap;">
 {% if election.frozen_at %}
-[<a href="{% url "helios.views.voters_email" election.uuid %}?voter_id={{voter.voter_login_id}}">email</a>]
+[<a href="{% url "election@voters@email" election.uuid %}?voter_id={{voter.voter_login_id}}">email</a>]
 {% endif %}
-[<a onclick="return confirm('are you sure you want to remove {{voter.name}} ?');" href="{% url "helios.views.voter_delete" election.uuid voter.uuid %}">x</a>]
+[<a onclick="return confirm('are you sure you want to remove {{voter.name}} ?');" href="{% url "election@voter@delete" election.uuid voter.uuid %}">x</a>]
 </td>
 <td>{{voter.voter_login_id}}</td>
 <td>{{voter.voter_email}}</td>
diff --git a/helios/templates/voters_manage.html b/helios/templates/voters_manage.html
index ccd54906ab945a00ec8b8cb5b57fd59ae71523a5..f2a83c794091be3b5268ad0734f9a8135d61cb1c 100644
--- a/helios/templates/voters_manage.html
+++ b/helios/templates/voters_manage.html
@@ -1,12 +1,12 @@
 {% extends TEMPLATE_BASE %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Manage Voters <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Manage Voters <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h2>
 
 <form method="get" action="{% url "helios.views.voters_search" election.uuid %}"><b>search</b>: <input type="text" name="q" /> <input type="submit" value="search" /></form>
 
 {% if upload_p %}
-<p><a href="{% url "helios.views.voters_upload" election_uuid=election.uuid %}">bulk upload voters</a></p>
+<p><a href="{% url "election@voters@upload" election_uuid=election.uuid %}">bulk upload voters</a></p>
 {% endif %}
 
 Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp;
@@ -29,7 +29,7 @@ Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp;
 <tr><td>{{voter.alias}}</td><td>{{voter.name}}</td><td>{{voter.voter_id}}
 {% if election.frozen_at %}
 {% else %}
-[<a onclick="return confirm('are you sure you want to remove {{voter.name}} ?');" href="{% url "helios.views.voter_delete" election.uuid voter.uuid %}">x</a>]
+[<a onclick="return confirm('are you sure you want to remove {{voter.name}} ?');" href="{% url "election@voter@delete" election.uuid voter.uuid %}">x</a>]
 {% endif %}
 </td></tr>
 {% endfor %}
diff --git a/helios/templates/voters_search.html b/helios/templates/voters_search.html
index 1adfb33fe1bf5123a30bae6eb03915644a23740b..162051f7095b9af671faa20000246c592968b673 100644
--- a/helios/templates/voters_search.html
+++ b/helios/templates/voters_search.html
@@ -1,12 +1,12 @@
 {% extends TEMPLATE_BASE %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Search Voters for '{{search_term}}' <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Search Voters for '{{search_term}}' <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h2>
 
 {% if voter %}
 Voter Found: {{voter.name}} ({{voter.voter_id}})<br /><br />
 {% if election.frozen_at %}
-<a href="{% url "helios.views.voters_email" election.uuid %}?voter_id={{voter.voter_id}}">email this voter</a>
+<a href="{% url "election@voters@email" election.uuid %}?voter_id={{voter.voter_id}}">email this voter</a>
 {% else %}
 once this election is frozen, you'll be able to email this voter.
 {% endif %}
diff --git a/helios/templates/voters_upload.html b/helios/templates/voters_upload.html
index a38956d019d1d02b90f43c184239e072f38353cd..908c147f124f4c342b034b6845bd406f3e5b8048 100644
--- a/helios/templates/voters_upload.html
+++ b/helios/templates/voters_upload.html
@@ -1,7 +1,7 @@
 {% extends TEMPLATE_BASE %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Bulk Upload Voters <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Bulk Upload Voters <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h2>
 
 <form method="post" action="" id="upload_form" enctype="multipart/form-data">
   <p>
diff --git a/helios/templates/voters_upload_confirm.html b/helios/templates/voters_upload_confirm.html
index c3d7c084b58b285b09959d3e72fc48ef28309cf6..911cb259d9d321e6bd0cc69ddc9cde95acb7320c 100644
--- a/helios/templates/voters_upload_confirm.html
+++ b/helios/templates/voters_upload_confirm.html
@@ -1,7 +1,7 @@
 {% extends TEMPLATE_BASE %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Bulk Upload Voters &mdash; Confirm<span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Bulk Upload Voters &mdash; Confirm<span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h2>
 
 <p>
 You have uploaded a file of voters. The first few rows of this file are:
@@ -23,7 +23,7 @@ HOLD ON:<br />
 </p>
 <br />
 
-<a href="{% url "helios.views.voters_upload_cancel" election.uuid %}">never mind, upload a different file</a>
+<a href="{% url "election@voters@upload-cancel" election.uuid %}">never mind, upload a different file</a>
 </p>
 
 {% else %}
@@ -34,7 +34,7 @@ HOLD ON:<br />
   <input type="submit" value="Yes, let's go" />
 </form>
 
-<a href="{% url "helios.views.voters_upload_cancel" election.uuid %}">no, let me upload a different file</a>
+<a href="{% url "election@voters@upload-cancel" election.uuid %}">no, let me upload a different file</a>
 
 {% endif %}
 
diff --git a/helios/views.py b/helios/views.py
index eec88a764cff54a7f06fd8b0dc43f1e2037adcf5..4fa9812ed4aa44fa34dce760e9b55fc8b89ab4e7 100644
--- a/helios/views.py
+++ b/helios/views.py
@@ -15,6 +15,7 @@ from validate_email import validate_email
 
 import urllib, os, base64
 
+import election_url_names as election_names
 from crypto import algs, electionalgs, elgamal
 from crypto import utils as cryptoutils
 from workflows import homomorphic
@@ -57,10 +58,10 @@ ELGAMAL_PARAMS_LD_OBJECT = datatypes.LDObject.instantiate(ELGAMAL_PARAMS, dataty
 from django.conf import settings
 
 def get_election_url(election):
-  return settings.URL_HOST + reverse(election_shortcut, args=[election.short_name])  
+  return settings.URL_HOST + reverse(election_shortcut, args=[election.short_name])
 
 def get_election_badge_url(election):
-  return settings.URL_HOST + reverse(election_badge, args=[election.uuid])  
+  return settings.URL_HOST + reverse(election_names.ELECTION_BADGE, args=[election.uuid])
 
 def get_election_govote_url(election):
   return settings.URL_HOST + reverse(election_vote_shortcut, args=[election.short_name])  
@@ -116,14 +117,14 @@ def election_single_ballot_verifier(request):
 def election_shortcut(request, election_short_name):
   election = Election.get_by_short_name(election_short_name)
   if election:
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
   else:
     raise Http404
 
 # a hidden view behind the shortcut that performs the actual perm check
 @election_view()
 def _election_vote_shortcut(request, election):
-  vote_url = "%s/booth/vote.html?%s" % (settings.SECURE_URL_HOST, urllib.urlencode({'election_url' : reverse(one_election, args=[election.uuid])}))
+  vote_url = "%s/booth/vote.html?%s" % (settings.SECURE_URL_HOST, urllib.urlencode({'election_url' : reverse(election_names.ELECTION_HOME, args=[election.uuid])}))
   
   test_cookie_url = "%s?%s" % (reverse(test_cookie), urllib.urlencode({'continue_url' : vote_url}))
 
@@ -208,7 +209,7 @@ def election_new(request):
         try:
           election = Election.objects.create(**election_params)
           election.generate_trustee(ELGAMAL_PARAMS)
-          return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+          return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
         except IntegrityError:
           error = "An election with short name %s already exists" % election_params['short_name']
       else:
@@ -241,7 +242,7 @@ def one_election_edit(request, election):
         setattr(election, attr_name, clean_data[attr_name])
       try:
         election.save()
-        return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+        return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
       except IntegrityError:
         error = "An election with short name %s already exists" % clean_data['short_name']
 
@@ -264,7 +265,7 @@ def one_election_extend(request, election):
       election.voting_extended_until = clean_data['voting_extended_until']
       election.save()
         
-      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
   
   return render_template(request, "election_extend", {'election_form' : election_form, 'election' : election})
 
@@ -303,7 +304,7 @@ def one_election_view(request, election):
   election_badge_url = get_election_badge_url(election)
   status_update_message = None
 
-  vote_url = "%s/booth/vote.html?%s" % (settings.SECURE_URL_HOST, urllib.urlencode({'election_url' : reverse(one_election, args=[election.uuid])}))
+  vote_url = "%s/booth/vote.html?%s" % (settings.SECURE_URL_HOST, urllib.urlencode({'election_url' : reverse(election_names.ELECTION_HOME, args=[election.uuid])}))
 
   test_cookie_url = "%s?%s" % (reverse(test_cookie), urllib.urlencode({'continue_url' : vote_url}))
   
@@ -399,7 +400,7 @@ def new_trustee(request, election):
     
     trustee = Trustee(uuid = str(uuid.uuid1()), election = election, name=name, email=email)
     trustee.save()
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(list_trustees_view, args=[election.uuid]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_TRUSTEES_VIEW, args=[election.uuid]))
 
 @election_admin(frozen=False)
 def new_trustee_helios(request, election):
@@ -407,13 +408,13 @@ def new_trustee_helios(request, election):
   Make Helios a trustee of the election
   """
   election.generate_trustee(ELGAMAL_PARAMS)
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(list_trustees_view, args=[election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_TRUSTEES_VIEW, args=[election.uuid]))
   
 @election_admin(frozen=False)
 def delete_trustee(request, election):
   trustee = Trustee.get_by_election_and_uuid(election, request.GET['uuid'])
   trustee.delete()
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(list_trustees_view, args=[election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_TRUSTEES_VIEW, args=[election.uuid]))
   
 def trustee_login(request, election_short_name, trustee_email, trustee_secret):
   election = Election.get_by_short_name(election_short_name)
@@ -423,7 +424,7 @@ def trustee_login(request, election_short_name, trustee_email, trustee_secret):
     if trustee:
       if trustee.secret == trustee_secret:
         set_logged_in_trustee(request, trustee)
-        return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(trustee_home, args=[election.uuid, trustee.uuid]))
+        return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_TRUSTEE_HOME, args=[election.uuid, trustee.uuid]))
       else:
         # bad secret, we'll let that redirect to the front page
         pass
@@ -454,7 +455,7 @@ Helios
   utils.send_email(settings.SERVER_EMAIL, ["%s <%s>" % (trustee.name, trustee.email)], 'your trustee homepage for %s' % election.name, body)
 
   logging.info("URL %s " % url)
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(list_trustees_view, args = [election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_TRUSTEES_VIEW, args = [election.uuid]))
 
 @trustee_check
 def trustee_home(request, election, trustee):
@@ -487,7 +488,7 @@ def trustee_upload_pk(request, election, trustee):
       # oh well, no message sent
       pass
     
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(trustee_home, args=[election.uuid, trustee.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_TRUSTEE_HOME, args=[election.uuid, trustee.uuid]))
 
 ##
 ## Ballot Management
@@ -535,7 +536,7 @@ def one_election_cast(request, election):
   on a GET, this is a cancellation, on a POST it's a cast
   """
   if request.method == "GET":
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args = [election.uuid]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args = [election.uuid]))
     
   user = get_user(request)
   encrypted_vote = request.POST['encrypted_vote']
@@ -564,7 +565,7 @@ def password_voter_login(request, election):
     # if user logged in somehow in the interim, e.g. using the login link for administration,
     # then go!
     if user_can_see_election(request, election):
-      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args = [election.uuid]))
+      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args = [election.uuid]))
 
     password_login_form = forms.VoterPasswordForm()
     return render_template(request, 'password_voter_login',
@@ -579,7 +580,7 @@ def password_voter_login(request, election):
     # login depending on whether this is a private election
     # cause if it's private the login is happening on the front page
     if election.private_p:
-      login_url = reverse(password_voter_login, args=[election.uuid])
+      login_url = reverse(election_names.ELECTION_PASSWORD_VOTER_LOGIN, args=[election.uuid])
     else:
       login_url = reverse(one_election_cast_confirm, args=[election.uuid])
 
@@ -935,7 +936,7 @@ def one_election_set_featured(request, election):
   election.featured_p = featured_p
   election.save()
   
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
 
 @election_admin()
 def one_election_archive(request, election):
@@ -949,7 +950,7 @@ def one_election_archive(request, election):
     
   election.save()
 
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
   
 @election_admin()
 def one_election_copy(request, election):
@@ -983,7 +984,7 @@ def one_election_copy(request, election):
   
 
   new_election.generate_trustee(ELGAMAL_PARAMS)
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[new_election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[new_election.uuid]))
 
 # changed from admin to view because 
 # anyone can see the questions, the administration aspect is now
@@ -1022,7 +1023,7 @@ def one_election_register(request, election):
   if not voter:
     voter = _register_voter(election, user)
     
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
 
 @election_admin(frozen=False)
 def one_election_save_questions(request, election):
@@ -1051,7 +1052,7 @@ def one_election_freeze(request, election):
     election.freeze()
 
     if get_user(request):
-      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
     else:
       return SUCCESS    
 
@@ -1067,7 +1068,7 @@ def one_election_compute_tally(request, election):
   tallying is done all at a time now
   """
   if not _check_election_tally_type(election):
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view,args=[election.election_id]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW,args=[election.election_id]))
 
   if request.method == "GET":
     return render_template(request, 'election_compute_tally', {'election': election})
@@ -1082,12 +1083,12 @@ def one_election_compute_tally(request, election):
 
   tasks.election_compute_tally.delay(election_id = election.id)
 
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view,args=[election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW,args=[election.uuid]))
 
 @trustee_check
 def trustee_decrypt_and_prove(request, election, trustee):
   if not _check_election_tally_type(election) or election.encrypted_tally == None:
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view,args=[election.uuid]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW,args=[election.uuid]))
     
   return render_template(request, 'trustee_decrypt_and_prove', {'election': election, 'trustee': trustee})
   
@@ -1136,7 +1137,7 @@ def release_result(request, election):
     if request.POST.get('send_email', ''):
       return HttpResponseRedirect("%s?%s" % (settings.SECURE_URL_HOST + reverse(voters_email, args=[election.uuid]),urllib.urlencode({'template': 'result'})))
     else:
-      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
 
   # if just viewing the form or the form is not valid
   return render_template(request, 'release_result', {'election': election})
@@ -1155,7 +1156,7 @@ def combine_decryptions(request, election):
     election.combine_decryptions()
     election.save()
 
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
 
   # if just viewing the form or the form is not valid
   return render_template(request, 'combine_decryptions', {'election': election})
@@ -1163,7 +1164,7 @@ def combine_decryptions(request, election):
 @election_admin(frozen=True)
 def one_election_set_result_and_proof(request, election):
   if election.tally_type != "homomorphic" or election.encrypted_tally == None:
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view,args=[election.election_id]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.election_id]))
 
   # FIXME: check csrf
   
@@ -1172,7 +1173,7 @@ def one_election_set_result_and_proof(request, election):
   election.save()
 
   if get_user(request):
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
   else:
     return SUCCESS
   
@@ -1331,12 +1332,12 @@ def voters_upload_cancel(request, election):
     vf.delete()
   del request.session['voter_file_id']
 
-  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+  return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
 
 @election_admin(frozen=True)
 def voters_email(request, election):
   if not VOTERS_EMAIL:
-    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+    return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
   TEMPLATES = [
     ('vote', 'Time to Vote'),
     ('simple', 'Simple'),
@@ -1413,7 +1414,7 @@ def voters_email(request, election):
         tasks.voters_email.delay(election_id = election.id, subject_template = subject_template, body_template = body_template, extra_vars = extra_vars, voter_constraints_include = voter_constraints_include, voter_constraints_exclude = voter_constraints_exclude)
 
       # this batch process is all async, so we can return a nice note
-      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(one_election_view, args=[election.uuid]))
+      return HttpResponseRedirect(settings.SECURE_URL_HOST + reverse(election_names.ELECTION_VIEW, args=[election.uuid]))
     
   return render_template(request, "voters_email", {
       'email_form': email_form, 'election': election,
diff --git a/server_ui/templates/confirm.html b/server_ui/templates/confirm.html
index d98f65fef5c7e46b9e480cb206ea8dd6408a06b6..33fb2a22af28cbf423dd92d3633d5fcebe1bee9c 100644
--- a/server_ui/templates/confirm.html
+++ b/server_ui/templates/confirm.html
@@ -38,7 +38,7 @@ function show_waiting() {
 </form>
 
 <p>
-    Forgot your password? <a href="{% url "helios_auth.auth_systems.password.password_forgotten_view" %}?return_url={% url "server_ui.views.cast_confirm" %}">Have it emailed to you</a>.<br />(don't worry, we won't forget your vote).
+    Forgot your password? <a href="{% url "helios_auth.auth_systems.password.password_forgotten_view" %}?return_url={% url "election@cast-confirm" %}">Have it emailed to you</a>.<br />(don't worry, we won't forget your vote).
 </p>
 </div>
 
diff --git a/server_ui/templates/done.html b/server_ui/templates/done.html
index 47ff73fa6023c847ea8fb2425c5bfc56b01d36d2..d4281060f7f16cef56798f82a06788da99467ddb 100644
--- a/server_ui/templates/done.html
+++ b/server_ui/templates/done.html
@@ -11,7 +11,7 @@
 </p>
 
 <p>
-    Visit the <a href="{% url "helios.views.one_election_view" election.uuid %}">election homepage</a>.
+    Visit the <a href="{% url "election@view" election.uuid %}">election homepage</a>.
 </p>
 
 {% endblock %}
diff --git a/server_ui/templates/election_tallied.html b/server_ui/templates/election_tallied.html
index 747e083fc3d4ed3433000fd8b1edf5f41bd7364d..42d44410f9b298eecc3c429b7eca9bcf98aaaf69 100644
--- a/server_ui/templates/election_tallied.html
+++ b/server_ui/templates/election_tallied.html
@@ -9,6 +9,6 @@
   </p>
   
   <p>
-      <a href="{% url "helios.views.one_election_view" election.uuid %}">view the election</a>
+      <a href="{% url "election@view" election.uuid %}">view the election</a>
   </p>
 {% endblock %}
\ No newline at end of file
diff --git a/server_ui/templates/index.html b/server_ui/templates/index.html
index e31ac19e9c3fa5bc425c623c5e5fe6d7b946cc38..6c2821e873728641ef13a6b9a4dc872760d2166a 100644
--- a/server_ui/templates/index.html
+++ b/server_ui/templates/index.html
@@ -63,7 +63,7 @@ More than <b>2,000,000 votes</b> have been cast using Helios.
 {% if elections_administered %}
 <ul>
 {% for election in elections_administered %}
-<li> <a href="{% url "helios.views.one_election_view" election.uuid %}">{{election.name}}</a></li>
+<li> <a href="{% url "election@view" election.uuid %}">{{election.name}}</a></li>
 {% endfor %}
 </ul>
 {% else %}
@@ -79,7 +79,7 @@ More than <b>2,000,000 votes</b> have been cast using Helios.
 {% if elections_voted %}
 <ul>
 {% for election in elections_voted %}
-<li><a href="{% url "helios.views.one_election_view" election.uuid %}">{{election.name}}</a></li>
+<li><a href="{% url "election@view" election.uuid %}">{{election.name}}</a></li>
 {% endfor %}
 </ul>
 {% else %}