diff --git a/helios/__init__.py b/helios/__init__.py
index 18371b7c46248d708dfd1aaa729394e72c61e8c0..06f05140bb83798916f63786610efa87d916e26a 100644
--- a/helios/__init__.py
+++ b/helios/__init__.py
@@ -1,5 +1,7 @@
 
 from django.conf import settings
+from django.core.urlresolvers import reverse
+from helios.views import election_shortcut
 
 TEMPLATE_BASE = settings.HELIOS_TEMPLATE_BASE or "helios/templates/base.html"
 
@@ -12,3 +14,4 @@ VOTERS_UPLOAD = settings.HELIOS_VOTERS_UPLOAD
 # allow emailing of voters?
 VOTERS_EMAIL = settings.HELIOS_VOTERS_EMAIL
 
+
diff --git a/helios/models.py b/helios/models.py
index af83572e0a42f29743b781af1d7c5bd4bdf0be8f..2ddc440286dfb29d250ea52ebb5e29a3b6e6682a 100644
--- a/helios/models.py
+++ b/helios/models.py
@@ -15,7 +15,7 @@ import datetime, logging, uuid, random
 
 from crypto import electionalgs, algs, utils
 from helios import utils as heliosutils
-import helios
+import helios.views
 
 from helios import datatypes
 
@@ -460,7 +460,7 @@ class Election(HeliosModel):
 
   @property
   def url(self):
-    return helios.get_election_url(self)
+    return helios.views.get_election_url(self)
 
   def init_tally(self):
     # FIXME: create the right kind of tally
diff --git a/helios/urls.py b/helios/urls.py
index b08550cba9453366c6bc104c64891aca6dde6fb4..6b19f880d75b6333cbb963f7a084dd3bb3ff0c9f 100644
--- a/helios/urls.py
+++ b/helios/urls.py
@@ -18,6 +18,7 @@ urlpatterns = patterns('',
 
   # election shortcut by shortname
   (r'^e/(?P<election_short_name>[^/]+)$', election_shortcut),
+  (r'^e/(?P<election_short_name>[^/]+)/vote$', election_vote_shortcut),
 
   # vote shortcut
   (r'^v/(?P<vote_tinyhash>[^/]+)$', castvote_shortcut),
diff --git a/helios/views.py b/helios/views.py
index 80c5497a0d8f7f8bc21d34a67b53d58f4430faeb..1ae48d306f2f866b7458deacb0760e7d26d4821c 100644
--- a/helios/views.py
+++ b/helios/views.py
@@ -49,10 +49,12 @@ ELGAMAL_PARAMS_LD_OBJECT = datatypes.LDObject.instantiate(ELGAMAL_PARAMS, dataty
 # single election server? Load the single electionfrom models import Election
 from django.conf import settings
 
-# a helper function
 def get_election_url(election):
   return settings.URL_HOST + reverse(election_shortcut, args=[election.short_name])  
 
+def get_election_govote_url(election):
+  return settings.URL_HOST + reverse(election_vote_shortcut, args=[election.short_name])  
+
 def get_castvote_url(cast_vote):
   return settings.URL_HOST + reverse(castvote_shortcut, args=[cast_vote.vote_tinyhash])
 
@@ -137,6 +139,17 @@ def election_shortcut(request, election_short_name):
   else:
     raise Http404
 
+def election_vote_shortcut(request, election_short_name):
+  election = Election.get_by_short_name(election_short_name)
+  if election:
+    vote_url = "%s/booth/vote.html?%s" % (settings.SECURE_URL_HOST, urllib.urlencode({'election_url' : reverse(one_election, args=[election.uuid])}))
+
+    test_cookie_url = "%s?%s" % (reverse(test_cookie), urllib.urlencode({'continue_url' : vote_url}))
+
+    return HttpResponseRedirect(test_cookie_url)
+  else:
+    raise Http404
+
 def castvote_shortcut(request, vote_tinyhash):
   try:
     cast_vote = CastVote.objects.get(vote_tinyhash = vote_tinyhash)
@@ -311,7 +324,7 @@ def one_election_view(request, election):
           }))
 
   trustees = Trustee.get_by_election(election)
-    
+
   return render_template(request, 'election_view',
                          {'election' : election, 'trustees': trustees, 'admin_p': admin_p, 'user': user,
                           'voter': voter, 'votes': votes, 'notregistered': notregistered, 'eligible_p': eligible_p,
@@ -1165,7 +1178,7 @@ def voters_email(request, election):
       extra_vars = {
         'custom_subject' : email_form.cleaned_data['subject'],
         'custom_message' : email_form.cleaned_data['body'],
-        'election_url' : get_election_url(election),
+        'election_url' : get_election_govote_url(election),
         'election' : election
         }