diff --git a/auth/auth_systems/password.py b/auth/auth_systems/password.py
index 83fbfae80ccd5e7df672a6debd6380a43b538b54..cbec6c9ce12d36057d47c908ffdeb5f3e53f9110 100644
--- a/auth/auth_systems/password.py
+++ b/auth/auth_systems/password.py
@@ -114,7 +114,6 @@ def update_status(token, message):
   pass
   
 def send_message(user_id, user_name, user_info, subject, body):
-  if user_info.has_key('email'):
-    email = user_info['email']
-    name = user_name or user_info.get('name', email)
-    send_mail(subject, body, settings.SERVER_EMAIL, ["%s <%s>" % (name, email)], fail_silently=False)    
+  email = user_id
+  name = user_name or user_info.get('name', email)
+  send_mail(subject, body, settings.SERVER_EMAIL, ["%s <%s>" % (name, email)], fail_silently=False)    
diff --git a/helios/models.py b/helios/models.py
index 0de508e123f6c152b9253d0aecc6b38c1f92a572..57fa376e29c7080134b76517ab664d177079c5a4 100644
--- a/helios/models.py
+++ b/helios/models.py
@@ -9,6 +9,7 @@ Ben Adida
 from django.db import models, transaction
 from django.utils import simplejson
 from django.conf import settings
+from django.core.mail import send_mail
 
 import datetime, logging, uuid, random
 
@@ -510,9 +511,8 @@ class VoterFile(models.Model):
       if len(voter) > 2:
         name = voter[2]
     
-      # create the user -- NO MORE!
-      # user = User.update_or_create(user_type='password', user_id=voter_id, info = {'password': heliosutils.random_string(10), 'email': email, 'name': name})
-      # user.save()
+      # create the user -- NO MORE
+      # user = User.update_or_create(user_type='password', user_id=email, info = {'name': name})
     
       # does voter for this user already exist
       voter = Voter.get_by_election_and_voter_id(election, voter_id)
@@ -520,7 +520,8 @@ class VoterFile(models.Model):
       # create the voter
       if not voter:
         voter_uuid = str(uuid.uuid4())
-        voter = Voter(uuid= voter_uuid, user = None, voter_login_id = voter_id, voter_name = name, election = election)
+        voter = Voter(uuid= voter_uuid, user = None, voter_login_id = voter_id,
+                      voter_name = name, voter_email = email, election = election)
         voter.generate_password()
         new_voters.append(voter)
         voter.save()
@@ -546,12 +547,15 @@ class Voter(models.Model, electionalgs.Voter):
   # let's link directly to the user now
   # voter_type = models.CharField(max_length = 100)
 
+  # for users of type password, no user object is created
+  # but a dynamic user object is created automatically
   user = models.ForeignKey('auth.User', null=True)
 
   # if user is null, then you need a voter login ID and password
   voter_login_id = models.CharField(max_length = 100, null=True)
   voter_password = models.CharField(max_length = 100, null=True)
   voter_name = models.CharField(max_length = 200, null=True)
+  voter_email = models.CharField(max_length = 250, null=True)
   
   uuid = models.CharField(max_length = 50)
   
@@ -563,6 +567,13 @@ class Voter(models.Model, electionalgs.Voter):
   vote_hash = models.CharField(max_length = 100, null=True)
   cast_at = models.DateTimeField(auto_now_add=False, null=True)
 
+  def __init__(self, *args, **kwargs):
+    super(Voter, self).__init__(*args, **kwargs)
+
+    # stub the user so code is not full of IF statements
+    if not self.user:
+      self.user = User(user_type='password', user_id=self.voter_email, name=self.voter_name)
+
   @classmethod
   @transaction.commit_on_success
   def register_user_in_election(cls, user, election):
@@ -617,11 +628,9 @@ class Voter(models.Model, electionalgs.Voter):
 
   @classmethod
   def get_by_election_and_voter_id(cls, election, voter_id):
-    query = cls.objects.filter(election = election, voter_login_id = voter_id)
-
     try:
-      return query[0]
-    except:
+      return cls.objects.get(election = election, voter_login_id = voter_id)
+    except cls.DoesNotExist:
       return None
     
   @classmethod
@@ -650,32 +659,23 @@ class Voter(models.Model, electionalgs.Voter):
 
   @property
   def name(self):
-    if self.user:
-      return self.user.name
-    else:
-      return self.voter_name
+    return self.user.name
 
   @property
   def voter_id(self):
-    if self.user:
-      return self.user.user_id
-    else:
-      return self.voter_login_id
+    return self.user.user_id
 
   @property
   def voter_type(self):
-    if self.user:
-      return self.user.user_type
-    else:
-      return 'password'
+    return self.user.user_type
 
   @property
   def display_html_big(self):
-    if self.user:
-      return self.user.display_html_big
-    else:
-      return """<img border="0" height="25" src="/static/auth/login-icons/password.png" alt="password" /> %s""" % self.name
+    return self.user.display_html_big
       
+  def send_message(self, subject, body):
+    self.user.send_message(subject, body)
+
   def generate_password(self, length=10):
     if self.voter_password:
       raise Exception("password already exists")
diff --git a/helios/templates/email/vote_body.txt b/helios/templates/email/vote_body.txt
index 7672da0dc2c703c53b4f09580251deea950cd89c..fa0a4db4a82bc09d3f815e80210b5c4abc28dc5e 100644
--- a/helios/templates/email/vote_body.txt
+++ b/helios/templates/email/vote_body.txt
@@ -5,8 +5,8 @@ Dear {{voter.name}},
 Election URL:  {{election_url}}
 Election Fingerprint:  {{voter.election.hash}}
 {% ifequal voter.voter_type "password" %}
-Your username: {{voter.user.user_id}}
-Your password: {{voter.user.info.password}}
+Your username: {{voter.voter_login_id}}
+Your password: {{voter.voter_password}}
 {% else %}
 Log in with your {{voter.voter_type}} account.
 {% endifequal %}{% if voter.vote_hash %}
diff --git a/helios/views.py b/helios/views.py
index 5a2b56043515b2f8d967bdccd3ad08b62ed2a82f..713fffbf6c196d888727ecafe1a83958596c5807 100644
--- a/helios/views.py
+++ b/helios/views.py
@@ -77,7 +77,24 @@ def stats(request):
 
   return render_template(request, "stats", {'elections' : elections_page.object_list, 'elections_page': elections_page,
                                             'limit' : limit})
-    
+
+
+def get_voter(request, user, election):
+  """
+  return the current voter
+  """
+  voter = None
+  if request.session.has_key('CURRENT_VOTER'):
+    voter = request.session['CURRENT_VOTER']
+    if voter.election != election:
+      voter = None
+
+  if not voter:
+    if user:
+      voter = Voter.get_by_election_and_user(election, user)
+  
+  return voter
+
 ##
 ## General election features
 ##
@@ -475,16 +492,8 @@ def one_election_cast_confirm(request, election):
   if not request.session.has_key('encrypted_vote'):
     return HttpResponseRedirect(settings.URL_HOST)
 
-  voter = None
-  if request.session.has_key('CURRENT_VOTER'):
-    voter = request.session['CURRENT_VOTER']
-    if voter.election != election:
-      voter = None
+  voter = get_voter(request, user, election)
 
-  if not voter:
-    if user:
-      voter = Voter.get_by_election_and_user(election, user)
-  
   # auto-register this person if the election is openreg
   if user and not voter and election.openreg:
     voter = _register_voter(election, user)
@@ -593,9 +602,9 @@ def one_election_cast_done(request, election):
   We store the ballot hash in the session
   """
   user = get_user(request)
+  voter = get_voter(request, user, election)
 
-  if user:
-    voter = Voter.get_by_election_and_user(election, user)
+  if voter:
     votes = CastVote.get_by_voter(voter)
     vote_hash = votes[0].vote_hash