diff --git a/helios/election_urls.py b/helios/election_urls.py
index e6654d16187cdd6d503c955d7808361d686410b1..c7cd8fc00fbfa75c7572b875238121673efb82cb 100644
--- a/helios/election_urls.py
+++ b/helios/election_urls.py
@@ -18,6 +18,7 @@ urlpatterns = patterns('',
     # edit election params
     (r'^/edit$', one_election_edit),
     (r'^/schedule$', one_election_schedule),
+    (r'^/extend$', one_election_extend),
     (r'^/archive$', one_election_archive),
 
     # badge
diff --git a/helios/forms.py b/helios/forms.py
index 8851d665bce7961b9e5673aa82ebad88debc6e54..2ef7c809f5b84d1e6e8ce7b88ed182d8c412d9b2 100644
--- a/helios/forms.py
+++ b/helios/forms.py
@@ -29,6 +29,9 @@ class ElectionForm(forms.Form):
   voting_ends_at = SplitDateTimeField(help_text = 'UTC date and time when voting ends',
                                    widget=SplitSelectDateTimeWidget, required=False)
 
+class ElectionTimeExtensionForm(forms.Form):
+  voting_extended_until = SplitDateTimeField(help_text = 'UTC date and time voting extended to',
+                                   widget=SplitSelectDateTimeWidget, required=False)
   
 class EmailVotersForm(forms.Form):
   subject = forms.CharField(max_length=80)
diff --git a/helios/templates/election_extend.html b/helios/templates/election_extend.html
new file mode 100644
index 0000000000000000000000000000000000000000..0db2c448ba96143d1f11d709f6ff924e4da8c46a
--- /dev/null
+++ b/helios/templates/election_extend.html
@@ -0,0 +1,17 @@
+{% extends TEMPLATE_BASE %}
+
+{% 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>
+  
+  <form class="prettyform" action="" method="POST" id="edit_election_form">
+    <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
+    <table class="pretty">
+     {{election_form.as_table}}
+     </table>
+  <div>
+  <label for="">&nbsp;</label><input type="submit" value="Extend Voting" id="update_button" />
+  </div>
+  </form>
+
+{% endblock %}
diff --git a/helios/templates/election_view.html b/helios/templates/election_view.html
index 472a8375b82074e008f7e6c53150a65d8ae7a1da..fba739cdf638698fc0e07903dafcf25a149bb283 100644
--- a/helios/templates/election_view.html
+++ b/helios/templates/election_view.html
@@ -247,6 +247,9 @@ 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 />
+{% endif %}
 
 <div style="background: lightyellow; padding:5px; padding-left: 10px; margin-top: 15px; border: 1px solid #aaa; width: 720px;" class="round">
 <a href="#" onclick="$('#auditbody').slideToggle(250);">Audit Info</a>
diff --git a/helios/views.py b/helios/views.py
index 08c3e6cdf163a8fddf75ea016a4f1f14eadc0e8c..39a5f2652c456f00300cf7769ba80683cc2290bd 100644
--- a/helios/views.py
+++ b/helios/views.py
@@ -254,6 +254,23 @@ def one_election_edit(request, election):
 def one_election_schedule(request, election):
   return HttpResponse("foo")
 
+@election_admin()
+def one_election_extend(request, election):
+  if request.method == "GET":
+    election_form = forms.ElectionTimeExtensionForm({'voting_extended_until': election.voting_extended_until})
+  else:
+    check_csrf(request)
+    election_form = forms.ElectionTimeExtensionForm(request.POST)
+
+    if election_form.is_valid():
+      clean_data = election_form.cleaned_data
+      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 render_template(request, "election_extend", {'election_form' : election_form, 'election' : election})
+
 @election_view()
 @return_json
 def one_election(request, election):