diff --git a/helios/templates/voters_upload.html b/helios/templates/voters_upload.html
index fcd97953173539a445ab366e8b48c782302cc670..9c3d7cc7374644667d4c4d0f807308dc41d2951f 100644
--- a/helios/templates/voters_upload.html
+++ b/helios/templates/voters_upload.html
@@ -5,14 +5,23 @@
 
 <form method="post" action="" id="upload_form" enctype="multipart/form-data">
   <p>
-      If your election allows for password-based voters, then you can bulk upload them here.<br />
-      Please enter CSV content for your list of voters as follows:
+    If you would like to specify your list of voters by name and email address,<br />
+    you can bulk upload a list of such voters here.<br /><br />
+
+    Please prepare a text file of comma-separated values, as follows:
   </p>
   <pre>
       benadida,ben@adida.net,Ben Adida
       bob,bob@acme.org,Bob Acme
       ...
   </pre> 
+
+  <p>
+    The easiest way to prepare such a file is to use a spreadsheet program and to export as "CSV".
+  </p>
+  {% if error %}
+  <div style="color: red;">{{error}}</div>
+  {% endif %}
     <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
     
     <input type="file" name="voters_file" />
diff --git a/helios/views.py b/helios/views.py
index b25b045d9f178211d80325bf7a77c6d71d496939..01d8257b0b33d9c59e75e8e30400dfb83669bcfc 100644
--- a/helios/views.py
+++ b/helios/views.py
@@ -1142,7 +1142,7 @@ def voters_upload(request, election):
   #  raise PermissionDenied()
 
   if request.method == "GET":
-    return render_template(request, 'voters_upload', {'election': election})
+    return render_template(request, 'voters_upload', {'election': election, 'error': request.GET.get('e',None)})
     
   if request.method == "POST":
     if bool(request.POST.get('confirm_p', 0)):
@@ -1153,15 +1153,18 @@ def voters_upload(request, election):
       return HttpResponseRedirect(reverse(voters_list_pretty, args=[election.uuid]))
     else:
       # we need to confirm
-      voters_file = request.FILES['voters_file']
-      voter_file_obj = election.add_voters_file(voters_file)
+      if request.FILES.has_key('voters_file'):
+        voters_file = request.FILES['voters_file']
+        voter_file_obj = election.add_voters_file(voters_file)
 
-      request.session['voter_file_id'] = voter_file_obj.id
-
-      # import the first few lines to check
-      voters = [v for v in voter_file_obj.itervoters()][:5]
+        request.session['voter_file_id'] = voter_file_obj.id
+        
+        # import the first few lines to check
+        voters = [v for v in voter_file_obj.itervoters()][:5]
 
-      return render_template(request, 'voters_upload_confirm', {'election': election, 'voters': voters})
+        return render_template(request, 'voters_upload_confirm', {'election': election, 'voters': voters})
+      else:
+        return HttpResponseRedirect("%s?%s" % (reverse(voters_upload, args=[election.uuid]), urllib.urlencode({'e':'no voter file specified, try again'})))
 
 @election_admin()
 def voters_upload_cancel(request, election):